2012-06-14 48 views
5

我想知道是否有一種方法可以集成manipulate包或gWidgetsManipulate包,以便它們的輸出可以在html/markdown輸出文件中查看/操作,因爲我認爲這在開發可複製的交互式研究報告時非常有用。我知道googleVis具有一些功能,可以將它與knitr集成,以便通過使用諸如results ='asis'之類的選項將輸出內容導入到html文件中,但當使用滑塊時,googleVis目前在其功能方面的限制性很強。集成操縱輸出與knitr

如果操作包或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") 

但無濟於事......

任何幫助將不勝感激,謝謝提前

+2

我想'manipulate'是'googleVis'完全不同的;後者可以編寫允許交互的HTML/Javascript代碼,但我懷疑前者是否也行。 –

+0

gWidgets或gWidgetsManipulate或任何gWidgetsXXX包是否可以幫助編寫HTML/Javascript? –

+0

我對'gWidgetsManipulate'不太瞭解,但我幾乎可以肯定'gWidgets'不會將HTML/JS寫成字符串; 'gWidgetsWWW'或'gWidgetsWWW2'可能會創建網頁,但您真正需要的是HTML/JS片段,它可以嵌入到HTML文檔中。 –

回答

3

如果你不絕對需要使用gwidgets,我有一個Rook和googleVis解決方案可以實現您的目標:在html中顯示交互式圖表。

滑塊腳本:它包含一個小小的javascript函數來顯示當前選擇的值。它也會在每次更改時提交表單。您可以輕鬆更改此處的最小/最大/ ...值。

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

最後啓動安裝並啓動通過魯克的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() 
+0

哦!目前看起來非常好...謝謝!道歉,如果這是一個基本問題,但在控制檯中運行代碼帶來了可操縱的瀏覽器,這是很好的,但它可能顯示什麼需要將其放入一個Rmd文件,以便在運行knit2html()它集成它進入html輸出例如我期望RMD文件看起來像: 的r代碼之前隨機文本 '''{R} '代碼來生成集成車功能查看可操縱gvis ''' '亂評後的對象代碼和集成可操作的gvis對象。 –

+0

還有一種方法可以刪除提交按鈕,以便在變量更改後自動更新頁面?也許某種實時更新的滑塊功能?或者內置1秒刷新率? –

+0

我很想有一個靜態網頁的版本(可以用knitr生成),但googleVis軟件包不支持谷歌圖表控件... – nassimhddd