2012-06-14 2 views
5

Мне было интересно, есть ли способ, с помощью которого можно интегрировать пакет manipulate или gWidgetsManipulate, чтобы их выходы можно было просматривать/манипулировать в выходном файле html/markdown, так как я думаю, что это было бы чрезвычайно полезно при разработке воспроизводимых интерактивных исследовательских отчетов. Я знаю, что у googleVis есть некоторая функциональность, которая позволяет интегрировать его с knitr, чтобы выходы попадали в html-файл с помощью таких параметров, как results = 'asis', но googleVis в настоящее время весьма ограничивает свои возможности при использовании ползунков, например.интеграция управляющих выходов с knitr

Если выходные данные пакета управления или gWidgetsManipulate еще не были интегрированы, возможно ли было бы предложить временное решение, позволяющее просматривать его в html-файле?

i.e мой текущий код в моем файле Rmd перед запуском knitr-ing в html выглядит следующим образом ... но я получаю следующие ошибки.

```{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, которые могут быть _embedded_ в документе HTML. –

ответ

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

Мы строим код веб-страницы. Структура типична для ладьи: 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 чтобы выглядеть примерно так: 'случайный текст, прежде чем г кода ' '' {г} 'кода для создания интегрированной функции ладьи для просмотра манипулируем gvis объект ' '' 'случайных комментариев после код и интегрированный манипулируемый объект gvis. –

+0

Также есть способ удалить кнопку отправки, чтобы страница автоматически обновлялась сразу после изменения переменных? Возможно, какая-то функциональность слайдера, которая обновляется в реальном времени? или, возможно, встроенная частота обновления 1 секунды? –

+0

Я хотел бы иметь версию со статической веб-страницей (которая затем может быть сгенерирована с помощью knitr), но пакет googleVis не поддерживает элементы управления диаграммой google ... – nassimhddd

Смежные вопросы