#r #conditional-formatting #formatter #formattable
#r #условное форматирование #средство форматирования #форматируемый
Вопрос:
У меня есть фрейм данных, который будет отформатирован с использованием библиотеки R formattable. Я создал средство форматирования для применения соответствующего форматирования. Однако фрейм данных содержит некоторые NAS, и при их обнаружении форматирование завершается ошибкой. Что я действительно хотел бы сделать, так это закодировать средство форматирования так, чтобы оно условно определяло, когда применять формат, а когда нет. Приведенный ниже код иллюстрирует проблему.
library(formattable)
theData1 <- data.frame("A"=c(12.1456, 143.012), "B"=c(145.23435, 331.22335))
theData2 <- data.frame("A"=c(12.1456, 143.012), "B"=c(145.23435, 331.22335), "C"=c(143.012, NA))
MyFormatter <- formattable::formatter(
"span", style = ~ style(font.weight="bold"), x ~ style(round(x,2)))
tbl1 <- formattable::formattable(theData1, list('A'=MyFormatter, 'B'=MyFormatter))
tbl2 <- formattable::formattable(theData1, list('A'=MyFormatter, 'B'=MyFormatter, 'C'=MyFormatter))
Оператор: formattable(tbl2)
выдает ошибку с ошибкой «Ошибка в .mapply(функция (имя, значение) {:
входные данные нулевой длины нельзя смешивать с входными данными ненулевой длины «
Как я могу закодировать сегмент x ~ style(round(x,2))
так, чтобы он игнорировался, когда x равно NA ?
Ответ №1:
ifelse
может использоваться для обработки NA
s
MyFormatter <- formattable::formatter(
"span",
style = ~ style(font.weight = "bold"),
x ~ style(ifelse(!is.na(x), round(x, 2), ""))
)
formattable::formattable(theData2, list('A'=MyFormatter, 'B'=MyFormatter, 'C'=MyFormatter))
Комментарии:
1. Спасибо. Я думал, что попробовал ‘ifelse’, поскольку это функция, которую я часто использую, но, возможно, я поместил ее в неправильное расположение кода. В любом случае, спасибо… это работает.