5

我想知道是否有一种方法可以集成manipulate包或gWidgetsManipulate包,以便它们的输出可以在 html/markdown 输出文件中查看/操作,因为我认为这在开发可重现的交互式研究报告时非常有用. 我知道 googleVis 有一些功能允许它与 knitr 集成,以便通过使用 results='asis' 之类的选项将输出输入到 html 文件中,但是 googleVis 目前在使用滑块时的功能非常有限。

如果操作或 gWidgetsManipulate 的包输出尚未完全集成,是否可以暂时建议一种解决方法,使其可以在 html 文件中查看?

即在运行 knitr-ing 到 html 之前,我的 Rmd 文件中的当前代码如下所示......但我收到以下错误。

```{r}
library(manipulate)
manipulate(plot(1:x), x = slider(5, 10))
```

带输出

library(manipulate)
## Error: there is no package called 'manipulate'
manipulate(plot(1:x), x = slider(5, 10))
## Error: could not find function "manipulate"

所以尝试使用 gWidgetsManipulate 包...

```{r}
library(gWidgetsManipulate)
manipulate(plot(1:x), x = slider(5, 10))
```

你得到错误...

library("gWidgetsManipulate")
## Loading required package: gWidgets
manipulate(plot(1:x), x = slider(5, 10))
## Error: unable to find an inherited method for function ".gwindow", for signature "NULL"

我试图通过使用类似的东西来指定一个 guiToolkit 来修复这个错误

options(guiToolkit="WWW")

但无济于事...

任何帮助将不胜感激,在此先感谢

4

1 回答 1

3

如果您不是绝对需要使用 gwidgets,我有一个 Rook 和 googleVis 的解决方案可以满足您的需求:在 html 中显示交互式图表。

滑块的脚本:它包含一个小的 javascript 函数来显示当前选择的值。它还在每次更改时提交表单。您可以在此处轻松更改 min/max/... 值。

slider_script <- '
  <input type="range" min="5" max="10" name="plot_max" value="%s" step="1" onchange="document.form1.submit(); showValue(this.value);" />
  <span id="range">%s</span>
  <script type="text/javascript">
  function showValue(newValue)
{
    document.getElementById("range").innerHTML=newValue;
  }
</script>
'

我们构建网页的代码。rook 的结构很典型:html 代码写在 res$write() 中。

### this script builds the webpage
    webreport_app <- function(
      ){
      newapp = function(env) {
        req = Rook::Request$new(env)
        res = Rook::Response$new()
        # initialise variables for first execution
        if (is.null(req$POST())){
          plot_max <- 5
        } else{
          plot_max <- as.numeric(req$POST()[["plot_max"]])
        }
        res$write('<body style="font-family:Arial">')
        res$write("<H3>My App</H3>")
        res$write('<form name = "form1" method="POST">\n')
        res$write('<br> Number of dots: \n')
        res$write(sprintf(slider_script, plot_max, plot_max))
        res$write('<br><input type="submit" name="Go!">\n</form>\n')
        if (!is.null(req$POST())) {    
          # generate the plot
          library(googleVis)
          data_for_plot <- data.frame(x_var = 1:plot_max, y_var = 1:plot_max)
          Scatter1 <- gvisScatterChart(data_for_plot)
          # extract chart script
          chart_script <- capture.output(print(Scatter1, 'chart'))
          # write to html
          res$write(paste(chart_script, collapse="\n"))
          res$write("<br><br></body></html>")
        }
        res$finish()
      }
      return(newapp)
    }

最后启动设置并通过 Rook 启动 html 服务器:

library(Rook)

# launch the web app
if (exists("report_server")){
  report_server$remove(app, all = TRUE)
  report_server$stop()
  rm(report_server)
}
report_server = Rhttpd$new()
report_server$add(app = webreport_app(), name = "My_app")
report_server$start()
report_server$browse("My_app")
report_server$browse()
于 2012-07-08T16:48:08.743 回答