Как используется блестящий::markRenderFunction?

Вопрос Как я могу изменить размер графиков rgl в Shiny RMarkdown? обсуждается тот факт, что трудно установить размер rglwidget в динамическом документе R Markdown. Проблема заключается в том, что функция вывода Shiny устанавливает размер, но нет очевидного способа передать ему какие-либо аргументы, поэтому всегда используется размер по умолчанию 512 x 512.

rgl::renderRglwidget функция написана в соответствии с примером в htmlwidgets::shinyRenderWidget, который не предоставляет способа передать выходные аргументы:

rglwidgetOutput <- function(outputId, width = '512px', height = '512px'){
  shinyWidgetOutput(outputId, 'rglWebGL', width, height, package = 'rgl')
}

renderRglwidget <- function(expr, env = parent.frame(), quoted = FALSE) {
  if (!quoted) { expr <- substitute(expr) } # force quoted
  shinyRenderWidget(expr, rglwidgetOutput, env, quoted = TRUE)
}

Как видно из shiny документация, которую следует использовать shiny::markRenderFunction чтобы разрешить outputArgs чтобы быть переданным, но нет никаких примеров, которые я могу найти.

Что должно renderRglwidget похоже использовать shiny::markRenderFunction?

1 ответ

Решение

Оказывается, это довольно просто, хотя может быть несколько предостережений. rglwidgetOutput Функция была в порядке, как это было, но renderRglwidget необходимо изменить на

renderRglwidget <- function(expr, env = parent.frame(), quoted = FALSE, 
                            outputArgs = list()) {
  if (!quoted) { expr <- substitute(expr) } # force quoted
  markRenderFunction(rglwidgetOutput,
                     shinyRenderWidget(expr, rglwidgetOutput, env, quoted = TRUE),
                     outputArgs = outputArgs)
}

Связанный вопрос Как я могу изменить размер графиков rgl в Shiny RMarkdown? был отредактирован, чтобы показать, как это используется.

Предостережения: настройка outputArgs = list(height = "auto") появляется, чтобы выбрать нулевую высоту, а не оставшуюся высоту окна. width = "auto" действительно работает после изменения размера окна; до изменения размера он выглядит слишком большим. Точно так же, используя процентные значения дляwidth или же height неудовлетворительны Указание целочисленных значений или строк с px единицы (например, width = "300px"Выглядит хорошо.

Другие вопросы по тегам