Я рекомендую подходить к нему по-другому, отслеживая самое последнее значение «Имя» в каждой точке. fill()
из пакета tidyr полезен для этого.
library(dplyr)
library(tidyr)
originalDF %>%
mutate(Name = ifelse(Field == "Name", as.character(Value), NA)) %>%
fill(Name) %>%
filter(Field != "Name")
Вывод:
Index Field Value Name
1 2 Weight 115 Sara
2 3 Age 17 Sara
3 5 Weight 158 Bob
4 6 Age 22 Bob
5 7 Height 72 Bob
6 9 Weight 210 Irv
7 10 Age 42 Irv
8 11 Height 68 Irv
9 13 Age 155 Fred
10 14 Height 65 Fred
Однако, если вы действительно хотите использовать подход fuzzyjoin, вы можете добиться этого с помощью group_by()
и slice()
в своем результате, где вы возьмите последнюю строку для каждого значения Index.x
.
fuzzy_left_join(detailsDF, namesDF, by = "Index", match_fun = list(`>`)) %>%
group_by(Index.x) %>%
slice(n()) %>%
ungroup()
Вывод:
# A tibble: 10 x 6
Index.x Field.x Value.x Index.y Field.y Value.y
<int> <fct> <fct> <int> <fct> <fct>
1 2 Weight 115 1 Name Sara
2 3 Age 17 1 Name Sara
3 5 Weight 158 4 Name Bob
4 6 Age 22 4 Name Bob
5 7 Height 72 4 Name Bob
6 9 Weight 210 8 Name Irv
7 10 Age 42 8 Name Irv
8 11 Height 68 8 Name Irv
9 13 Age 155 12 Name Fred
10 14 Height 65 12 Name Fred
В «сгруппированном» UITableView на iPhone он по-прежнему будет отображать минимальную высоту для верхнего и нижнего колонтитула, фактически игнорируя ваш код, чтобы установить его на ноль. Он не связан с XIB по умолчанию.
Это связано с тем, что заголовок или нижний колонтитул раздела нулевой высоты выглядели бы очень странно. Поэтому Apple постановила, что высота заголовка не может быть установлена на 0. И поэтому несколько «пустых» разделов будут отображаться странно, как показано на вашем скриншоте.
Боюсь, это все потому, что вы ошиблись при очистке заголовка. размер при отсутствии строк данных; вместо этого вы не должны вызывать какие-либо методы для пустых разделов . Это плохой метод, потому что, по сути, iPhone должен вызывать больше методов, чем нужно, а также вы визуализируете больше заголовков, чем хотите (обычно - иногда люди хотят оставить там пустые заголовки, например, для перетаскивания).
Так, например, давайте представим, что у вас есть несколько разделов, но только некоторые из них содержат более одной строки (возможно, в зависимости от настроек / фильтров пользователя).
неправильный способ его реализации:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return totalNumberOfPossibleSections;
}
и затем для каждого раздела у вас нет результата для:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (![section hasRow]) return 0;
}
и
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
if (![section hasRow]) return 0.0f;
}
правильный способ его реализации is:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}
и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...
Надеюсь, это поможет!
например, для перетаскивания).Итак, например, давайте представим, что у вас есть несколько разделов, но только некоторые из них содержат более одной строки (возможно, на основе пользовательских настроек / фильтров).
неправильный способ его реализации:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return totalNumberOfPossibleSections;
}
и затем для каждого раздела у вас нет результата для:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (![section hasRow]) return 0;
}
и
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
if (![section hasRow]) return 0.0f;
}
правильный способ его реализации is:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}
и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...
Надеюсь, это поможет!
например, для перетаскивания).Итак, например, давайте представим, что у вас есть несколько разделов, но только некоторые из них содержат более одной строки (возможно, на основе пользовательских настроек / фильтров).
неправильный способ реализации:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return totalNumberOfPossibleSections;
}
, а затем для каждого раздела у вас нет результата для:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (![section hasRow]) return 0;
}
и
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
if (![section hasRow]) return 0.0f;
}
правильный способ реализации is:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}
и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...
Надеюсь, это поможет!
но только некоторые из них содержат более одной строки (возможно, в зависимости от настроек / фильтров пользователя).неправильный способ его реализации:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return totalNumberOfPossibleSections;
}
и затем для каждого раздела у вас нет результата для:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (![section hasRow]) return 0;
}
и
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
if (![section hasRow]) return 0.0f;
}
правильный способ его реализации is:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}
и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...
Надеюсь, это поможет!
но только некоторые из них содержат более одной строки (возможно, в зависимости от настроек / фильтров пользователя).неправильный способ реализации:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return totalNumberOfPossibleSections;
}
, а затем для каждого раздела у вас нет результата для:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (![section hasRow]) return 0;
}
и
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
if (![section hasRow]) return 0.0f;
}
правильный способ реализации is:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}
и тогда в каждом разделе будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...
Надеюсь, это поможет!
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}
, и тогда в каждой секции будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...
Надеюсь, это поможет!
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return numberOfSectionsWhichHaveAtLeastOneRowInThem;
}
, и тогда в каждой секции будет хотя бы один результат. Таким образом, разделы без данных даже не отображаются, для них даже не вызываются методы. Примечание: мои имена двух переменных составлены так, чтобы передать то, что они будут содержать! Это не специальные переменные Apple ...
Надеюсь, это поможет!
Это немного сложно, так как значение 0.0f не принимается. но все, что достаточно близко к нулю, поможет. Если вы решите не быть идеальным по пикселям и хотите округлить числа, то 1.0f сделает почти то же самое, так как разница в высоте в 1 пиксель будет довольно заметна.
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
if(section == 1 )
return 0.000001f;
else return 44.0f; // put 22 in case of plain one..
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 0.000001f; //removing section footers
}
У меня была похожая проблема: я загружал UITableView
из XIB (такой же как и вы) и предоставлял высоту 0 для некоторых нижних колонтитулов с tableView:heightForFooterInSection
(так же, как у вас), но значение было проигнорировано.
Исправление было простым: также установите высоту нижнего колонтитула на 0,0 в XIB. (В Интерфейсном Разработчике выберите Табличное представление, нажмите Command-3, чтобы просмотреть инспектор размера, найдите поле высоты нижнего колонтитула в верхней части)
После того, как это было сделано, он соответствовал пользовательской высоте нижнего колонтитула, как и ожидалось. (Возможно, он рассматривает высоту нижнего колонтитула XIB как минимум?)
Это работает для меня:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
tableView.sectionHeaderHeight = (section == 0 ? 10 : 0);
return tableView.sectionHeaderHeight;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
tableView.sectionFooterHeight = (section == 0 ? 20 : 4);
return tableView.sectionFooterHeight;
}
На самом деле, со мной все происходит наоборот. Я назначил заголовок раздела равным 10 в xib, но для первого раздела мне нужен заголовок заголовка размера. Я использую этот метод в своем UITableViewCotroller
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section==0)
return 125;
return tableView.rowHeight;
}
, но высота заголовка раздела не изменяется, даже если метод вызывается.