2012-06-14 11 views
5

Zastanawiam się, czy istnieje sposób, w jaki można zintegrować pakiet manipulate lub gWidgetsManipulate tak, aby ich wyjścia można było wyświetlać/manipulować w pliku wyjściowym html/markdown, ponieważ myślę, że to byłby niezwykle przydatny przy tworzeniu powtarzalnych interaktywnych raportów badawczych. Wiem, że googleVis ma pewną funkcjonalność, która pozwala na integrację z knitr, tak aby wyjścia trafiały do ​​pliku html przy użyciu opcji takich jak results = 'asis', ale googleVis ma obecnie dość restrykcyjne możliwości w przypadku używania suwaków na przykład.integrujące wyjścia manipulacyjne z knitr

Jeśli dane wyjściowe pakietów manipulatora lub gWidgetsManipulate nie zostały jeszcze w pełni zintegrowane, czy możliwe jest zaproponowanie tymczasowego obejścia problemu, które pozwoli na przeglądanie tego pliku w pliku HTML?

tj. Mój obecny kod w moim pliku Rmd przed uruchomieniem knitr-ing do html wygląda jak poniżej ... ale dostaję następujące błędy.

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

z wyjściem

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

więc próbuje pakiet gWidgetsManipulate zamiast ...

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

otrzymasz błąd ...

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" 

próbowałem podaj guiToolkit, aby naprawić ten błąd przez nas ing rzeczy jak

options(guiToolkit="WWW") 

ale bezskutecznie ...

Każda pomoc będzie bardzo mile widziane, Dzięki z góry

+2

Chyba 'manipulate' jest zupełnie inny od' googleVis'; ten ostatni może napisać kod HTML/JavaScript, który pozwala na interakcję, ale wątpię, czy ten pierwszy również to robi. –

+0

Czy gWidgets lub gWidgetsManipulate ani żaden z pakietów gWidgetsXXX nie pomaga w napisaniu kodu HTML/JavaScript? –

+0

Nie wiem zbyt wiele na temat 'gWidgetsManipulate', ale jestem prawie pewien, że' gWidgets' nie pisze HTML/JS jako ciągów znaków; 'gWidgetsWWW' lub' gWidgetsWWW2' może tworzyć strony internetowe, ale to, czego naprawdę potrzebujesz, to fragmenty HTML/JS, które mogą być _embedded_ w dokumencie HTML. –

Odpowiedz

3

Jeśli nie koniecznie musisz użyć gWidgets, mam rozwiązanie z Rook i googleVis, które robi to, co chcesz: wyświetlanie interaktywnego wykresu w html.

Skrypt dla suwaka: zawiera trochę funkcji javascript, aby wyświetlić aktualnie wybraną wartość. Przesyła również formularz przy każdej zmianie. Możesz łatwo zmienić wartości min/max/... tutaj.

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

Budujemy kodu strony internetowej. Struktura jest typowa dla wieża: kod html jest napisany wewnątrz 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) 
    } 

I wreszcie uruchomić instalację i uruchomienie serwera HTML poprzez Rook:

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! Na razie wygląda to bardzo dobrze ... Dziękuję!Przepraszam, jeśli jest to podstawowe pytanie, ale uruchomienie kodu w konsoli powoduje wyświetlenie przeglądarki, która jest łatwa do manipulowania, co jest świetne, ale czy możliwe jest pokazanie dokładnie tego, co jest potrzebne, aby umieścić ją w pliku Rmd, aby podczas działania knit2html() integrował się do wyjścia html np I oczekiwałby plik RMD aby wyglądał: 'tekst losowo przed kodem r ' '' {r} 'kod, aby wygenerować zintegrowaną funkcję rook aby manipulowany gvis sprzeciw ' '' 'losowe komentarze po kod i zintegrowany manipulowany obiekt gvis. –

+0

Czy istnieje również sposób na usunięcie przycisku przesyłania, aby strona aktualizowała się automatycznie, gdy zmienne zostały zmienione? Być może jakiś rodzaj funkcjonalności suwaka, który aktualizuje się w czasie rzeczywistym? a może wbudowana 1-sekundowa częstotliwość odświeżania? –

+0

Chciałbym mieć wersję ze statyczną stroną internetową (którą następnie można wygenerować za pomocą knitr), ale pakiet googleVis nie obsługuje formantów wykresu google ... – nassimhddd

Powiązane problemy