интеграция манипулятивных выходов с Knitr

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

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

то есть мой текущий код в моем файле Rmd перед запуском вязания в 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")

но безрезультатно...

Любая помощь будет принята с благодарностью, заранее спасибо


person h.l.m    schedule 14.06.2012    source источник
comment
Я думаю, что manipulate сильно отличается от googleVis; последний может писать код HTML/Javascript, который позволяет взаимодействие, но я сомневаюсь, что первый тоже.   -  person Yihui Xie    schedule 15.06.2012
comment
Разве gWidgets или gWidgetsManipulate или любой из пакетов gWidgetsXXX не помогают в написании HTML/Javascript?   -  person h.l.m    schedule 15.06.2012
comment
Я мало что знаю о gWidgetsManipulate, но я почти уверен, что gWidgets не записывает HTML/JS в виде строк символов; gWidgetsWWW или gWidgetsWWW2 могут создавать веб-страницы, но вам действительно нужны фрагменты кода HTML/JS, которые можно встроить в HTML-документ.   -  person Yihui Xie    schedule 15.06.2012


Ответы (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)
    }

И, наконец, запускаем настройку и запускаем html-сервер через 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()
person nassimhddd    schedule 08.07.2012
comment
Ой! Пока это выглядит очень-очень хорошо... Спасибо! Извиняюсь, если это основной вопрос, но запуск кода в консоли вызывает браузер, которым можно манипулировать, и это здорово, но возможно ли показать, что именно нужно поместить в файл Rmd, чтобы при запуске Knit2html() он интегрировался это в вывод html, например я ожидаю, что файл Rmd будет выглядеть примерно так: random text before r code ```{r} code для создания встроенной функции ладьи для просмотра манипулируемого объекта gvis ``` случайные комментарии после кода и интегрированного манипулируемого объекта gvis. - person h.l.m; 09.07.2012
comment
Также есть ли способ удалить кнопку отправки, чтобы страница автоматически обновлялась при изменении переменных? Возможно, какая-то функция слайдера, которая обновляется в реальном времени? или, возможно, встроенная частота обновления 1 секунда? - person h.l.m; 09.07.2012
comment
Я хотел бы иметь версию со статической веб-страницей (которую затем можно было бы создать с помощью Knitr), но пакет googleVis не поддерживает элементы управления диаграммами Google... - person nassimhddd; 11.07.2012
comment
Я отредактировал свой ответ для автоматического обновления. Это не идеально, так как оно будет обновляться на каждом шагу... - person nassimhddd; 11.07.2012