【问题标题】:integrating manipulate outputs with knitr将操作输出与 knitr 集成
【发布时间】:2012-06-14 23:21:00
【问题描述】:

我想知道是否有一种方法可以集成 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")

但无济于事......

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

【问题讨论】:

  • 我猜manipulategoogleVis 很不一样;后者可以编写允许交互的 HTML/Javascript 代码,但我怀疑前者是否也可以。
  • gWidgets 或 gWidgetsManipulate 或任何 gWidgetsXXX 软件包是否有助于编写一些 HTML/Javascript?
  • 我对@9​​87654330@了解不多,但我几乎可以肯定gWidgets不会将HTML/JS写成字符串; gWidgetsWWWgWidgetsWWW2 可以创建网页,但您真正需要的是可以嵌入 HTML 文档中的 HTML/JS sn-ps。

标签: html r knitr gwidgets


【解决方案1】:

如果您不是绝对需要使用 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()

【讨论】:

  • 哦!到目前为止看起来非常非常好......谢谢!抱歉,如果这是一个基本问题,但在控制台中运行代码会显示可操作的浏览器,这很好,但是否可以准确显示需要将其放入 Rmd 文件中的内容,以便在运行 knit2html() 时集成将其放入 html 输出中,例如我希望 Rmd 文件看起来像:random text before r code ```{r} code 以生成集成的 rook 函数以在代码和集成的可操作 gvis 对象之后查看可操作 gvis 对象 ``` `random cmets。
  • 还有没有办法删除提交按钮,以便在变量更改后页面自动更新?也许某种实时更新的滑块功能?还是内置 1 秒刷新率?
  • 我希望有一个带有静态网页的版本(然后可以用 knitr 生成),但是 googleVis 包不支持 google 图表控件...
  • 我已编辑我的答案以自动更新。它并不完美,因为它会在每一步更新......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 2019-01-11
相关资源
最近更新 更多