2012-06-14 18 views
5

Me preguntaba si hay una manera de integrar el paquete manipulate o el paquete gWidgetsManipulate para que sus salidas puedan ser visibles/manipulables en el archivo de salida html/markdown, ya que creo que esto sería extremadamente útil al desarrollar informes reproducibles de investigación interactiva. Sé que googleVis tiene alguna funcionalidad que permite que se integre con knitr para que las salidas entren en el archivo html usando opciones como results = 'asis', pero googleVis es actualmente bastante restrictivo en sus capacidades cuando se usan controles deslizantes, por ejemplo.integrando manipulación de salidas con knitr

Si las salidas de paquete de manipulate o gWidgetsManipulate aún no se han integrado, ¿sería posible sugerir una solución por el momento que permita que se vea en el archivo html?

es decir, mi código actual en mi archivo Rmd antes de ejecutar knitr-ing a html tiene el siguiente aspecto ... pero obtengo los siguientes errores.

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

con la salida

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

por lo que tratar el paquete gWidgetsManipulate lugar ...

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

se obtiene el error ...

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" 

he tratado de especifica un guiToolkit para corregir este error por nosotros ing cosas como

options(guiToolkit="WWW") 

pero fue en vano ...

Cualquier ayuda sería muy apreciada, gracias de antemano

+2

supongo 'manipulate' es bastante diferente con' googleVis'; este último puede escribir código HTML/Javascript que permite la interacción, pero dudo que el primero también lo haga. –

+0

¿No ayudan gWidgets o gWidgetsManipulate o ninguno de los paquetes gWidgetsXXX a escribir algo de HTML/Javascript? –

+0

No sé mucho sobre 'gWidgetsManipulate', pero estoy casi seguro de que' gWidgets' no escribe HTML/JS como cadenas de caracteres; 'gWidgetsWWW' o' gWidgetsWWW2' pueden crear páginas web, pero lo que realmente necesita son fragmentos HTML/JS que pueden ser _embedded_ en un documento HTML. –

Respuesta

3

Si no absolutamente necesario utilizar los gWidgets, tengo una solución con Rook y googleVis que hace lo que desea: mostrar un gráfico interactivo en html.

El script para el control deslizante: contiene una pequeña función de javascript para mostrar el valor actualmente elegido. También envía el formulario en cada cambio. Puede cambiar fácilmente los valores min/max/... aquí.

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> 
' 

Generamos el código de la página web. La estructura es típica para rook: el código html se escribe dentro de 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) 
    } 

Y finalmente lanzará la instalación y poner en marcha el servidor HTML a través de torre:

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

¡Oh! Eso se ve muy bien hasta ahora ... ¡Gracias!Disculpe si esta es una pregunta básica, pero al ejecutar el código en la consola aparece un navegador que es manipulable, lo cual es genial, pero ¿es posible mostrar exactamente qué se necesita para ponerlo en un archivo Rmd para que cuando se ejecute knit2html() integre en la salida html, por ejemplo Yo esperaría que el archivo Rmd que se ve algo como: 'texto al azar antes del código r ' '' {r} 'código para generar la función de torre integrada para ver GVIS manipulables objeto ' '' 'comentarios al azar después de la código y objeto gvis manipulable integrado. –

+0

¿Existe alguna forma de eliminar el botón de envío para que la página se actualice automáticamente tan pronto como se cambien las variables? ¿Tal vez algún tipo de funcionalidad de control deslizante que se actualiza en tiempo real? o tal vez una tasa de actualización de 1 segundo integrada? –

+0

Me encantaría tener una versión con una página web estática (que luego se podría generar con knitr), pero el paquete googleVis no es compatible con los controles de gráfico de Google ... – nassimhddd