如何将变量传递给widget_html

时间:2016-07-10 22:36:22

标签: r htmlwidgets

问题

Custom widget HTML上的htmlwidgets.org页面的最后一部分说,您可以通过创建名为<widget_name>_html

的函数将自己的html添加到窗口小部件

如何将变量传递给此函数?

示例

我创建了一个名为 myWidgetHTML 的新包,并运行htmlwidgets::scaffoldWidget(name = "myHTML”)。该软件包托管在我的github page

在生成的R/myHTML.R文件中,我创建了函数

#' @import htmltools
myHTML_html <- function(id, class, style, ...){
    myString <- "hello world"
    tags$p(myString)
}

构建和运行窗口小部件会按预期生成字符串hello world

library(myWidgetHTML)
myHTML(message = "")

enter image description here

我无法弄清楚如何编写函数以便我可以将变量myString传递给它:

#' @import htmltools
#' @export
myHTML_html <- function(id, class, style, myString, ...){
    tags$p(myString)
}

通过source code for the widgets并没有任何启示,因为相关部分(下面复制)表明它通过...接受了进一步的论证,但我看不到从哪里发送它们。

widget_html <- function(name, package, id, style, class, inline = FALSE, ...){

  # attempt to lookup custom html function for widget
  fn <- tryCatch(get(paste0(name, "_html"),
                     asNamespace(package),
                     inherits = FALSE),
                 error = function(e) NULL)

  # call the custom function if we have one, otherwise create a div
  if (is.function(fn)) {
    fn(id = id, style = style, class = class, ...)
  } else if (inline) {
    tags$span(id = id, style = style, class = class)
  } else {
    tags$div(id = id, style = style, class = class)
  }
}

1 个答案:

答案 0 :(得分:2)

要结束这个问题,官方的答案是这是不可能的。

参考: 来自@timelyportfolio的This tweet

  

截至目前,还没有真正的方法来实现这个目标

我认为可能的解决方案是将x传递给widget_html,因此建议将其作为潜在的解决方案。然而,@ jjallaire指出,当与Shiny

一起使用时,这项工作不会失败

参考: Issue 212

  

问题在于Shiny应用程序&#34; x&#34;当widget_html被调用时尚未知道。实现这一目标的最佳方法是在JavaScript端第一次调用renderValue时根据需要改变DOM。