R `sprintf` с HTML-тегами дает` аргументы не могут быть переработаны до одинаковой длины` - PullRequest
0 голосов
/ 29 мая 2018

У меня есть data.frame res с 2 строками, и я хочу поместить значения в функцию sprintf с тегами HTML.Если я использую функцию tags$strong("some character"), я получаю ошибку.Если я наберу <strong>some character</strong>, это работает.Если у меня есть 3 строки в df, оба кода работают.Вот MWE с 2 рядами data.frame:

res <- data.frame(term = letters[1:2], p.value = c(0.567, 0.123), hazard = c(1.234, 3.421))
sprintf(
  "%s: %s %.3f %s %.3f</br>",
  res$term,
  tags$strong("p-value: "),
  res$p.value,
  tags$strong("Hazard Ratio: "),
  res$hazard
)
# Error in sprintf("%s: %s %.3f %s %.3f</br>", res$term, tags$strong("p-value: "),  : 
#  arguments cannot be recycled to the same length
sprintf(
  "%s: %s %.3f %s %.3f</br>",
  res$term,
  "<strong>p-value: </strong>",
  res$p.value,
  "<strong>Hazard Ratio: </strong>",
  res$hazard
)
# works!
# [1] "a: <strong>p-value: </strong> 0.567 <strong>Hazard Ratio: </strong> 1.234</br>" 
# [2] "b: <strong>p-value: </strong> 0.123 <strong>Hazard Ratio: </strong> 3.421</br>"

Три ряда data.frame:

res <- data.frame(term = letters[1:3], p.value = c(0.567, 0.123, 0.231), hazard = c(1.234, 3.421, 5.211))

sprintf(
  "%s: %s %.3f %s %.3f</br>",
  res$term,
  tags$strong("p-value: "),
  res$p.value,
  tags$strong("Hazard Ratio: "),
  res$hazard
)

sprintf(
  "%s: %s %.3f %s %.3f</br>",
  res$term,
  "<strong>p-value: </strong>",
  res$p.value,
  "<strong>Hazard Ratio: </strong>",
  res$hazard
)

Вопросы:

  1. Почему это нене работает, когда у меня есть 2 строки в df и он работает с 3 строками?
  2. Почему в двух строках df он не работает с функцией tags$strong?

1 Ответ

0 голосов
/ 29 мая 2018

Давайте посмотрим на минимальный пример, чтобы увидеть проблему более четко.Следующее работает

sprintf("%s: %s",
         tags$strong("Value "),
         1:3
     )

, но следующее не работает:

sprintf("%s: %s",
         tags$strong("Value "),
         1:2
     )

Очевидно, если вы попытаетесь, первое работает для векторов любой длины, кратной 3 (3, 6, 9, ...).Все остальные целые числа не работают (кроме 1, что является частным случаем).Решение заключается в структуре вашего блестящего HTML-тега, который представляет собой список длиной 3 :

str( tags$strong("Value ") )

List of 3
 $ name    : chr "strong"
 $ attribs : list()
 $ children:List of 1
  ..$ : chr "Value "
 - attr(*, "class")= chr "shiny.tag"

Это список длиной 3, где в качестве String <strong>Value</strong>является вектором длины 1. R пытается использовать tags$strong -Tag столько раз, сколько второй вектор длинный (res$x в вашем случае).К сожалению, он имеет длину 3, поэтому он не может дать ничего полезного, если его попросить перерабатывать только 2 раза.

С другой стороны, если вы просто напишите длину-1-строку <strong>Value</strong>, она может быть переработана любое количество раз, даже 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...