Можно ли создать средство форматирования в контексте R formattable, чтобы оно применялось условно?

#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’, поскольку это функция, которую я часто использую, но, возможно, я поместил ее в неправильное расположение кода. В любом случае, спасибо… это работает.