0

问题

htmlwidgets.org 页面上自定义小部件 HTML的最后一部分说,您可以通过创建一个名为的函数将自己的 html 添加到小部件<widget_name>_html

你如何将变量传递给这个函数?

例子

我创建了一个名为myWidgetHTML的新包,然后运行htmlwidgets::scaffoldWidget(name = "myHTML”)​​. 该软件包托管在我的github 页面上

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

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

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

library(myWidgetHTML)
myHTML(message = "")

在此处输入图像描述

我想不通的是如何编写函数以便我可以将变量传递给myString它:

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

浏览小部件的源代码并没有发现任何问题,因为相关部分(复制如下)表明它通过 接受进一步的参数...,但我看不到从哪里发送它们。

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)
  }
}
4

1 回答 1

2

为了结束这个问题,官方的回答是这是不可能的。

参考: 来自@timelyportfolio 的这条推文

截至目前,没有真正的方法来实现这一点

我认为一个可能的解决方案是传递xwidget_html,因此将其作为潜在的解决方案提出。但是,@jjallaire 指出这在与 Shiny 一起使用时不起作用

参考: 第 212 期

问题是在 Shiny 应用程序中,“x”在调用 widget_html 时还不知道。完成此操作的最佳方法是在 JavaScript 端第一次调用 renderValue 时根据需要更改 DOM。

于 2016-07-12T03:17:48.657 回答