#r #r-markdown #rstudio #windows-task-scheduler #htmlwidgets
Вопрос:
В RStudio я могу сохранить свой html-виджет в один файл с:
htmlwidgets::saveWidget(x,"filename.html",selfcontained=TRUE)
При запуске сценария R с указанной выше строкой через планировщик задач Windows (который вызывает Rscript.exe) это приведет к созданию многофайлового html (т. е. html — файла со связанным каталогом ссылочных материалов). С помощью RGui также не удалось создать html-файл с одним файлом.
Это строки из реализации Rgui, которая воспроизводит проблему:
> library(leaflet)
> library(htmlwidgets)
> map <- leaflet::leaflet() %>% addTiles() %>% setView(lng=172.4,lat=-41,zoom=6)
> saveWidget(map,file="deleteme.html",selfcontained=TRUE)
Error in saveWidget(map, file = "deleteme.html", selfcontained = TRUE) :
Saving a widget with selfcontained = TRUE requires pandoc. For details see:
https://github.com/rstudio/rmarkdown/blob/master/PANDOC.md
> list.files(getwd(),full.names=FALSE, recursive=TRUE)
[1] "deleteme.html"
[2] "deleteme_files/htmlwidgets-1.5.3/htmlwidgets.js"
[3] "deleteme_files/jquery-1.12.4/jquery.min.js"
[4] "deleteme_files/leaflet-1.3.1/images/layers-2x.png"
[5] "deleteme_files/leaflet-1.3.1/images/layers.png"
[6] "deleteme_files/leaflet-1.3.1/images/marker-icon-2x.png"
[7] "deleteme_files/leaflet-1.3.1/images/marker-icon.png"
[8] "deleteme_files/leaflet-1.3.1/images/marker-shadow.png"
[9] "deleteme_files/leaflet-1.3.1/leaflet.css"
[10] "deleteme_files/leaflet-1.3.1/leaflet.js"
[11] "deleteme_files/leaflet-binding-2.0.4.1/leaflet.js"
[12] "deleteme_files/leafletfix-1.0.0/leafletfix.css"
[13] "deleteme_files/proj4-2.6.2/proj4.min.js"
[14] "deleteme_files/Proj4Leaflet-1.0.1/proj4leaflet.js"
[15] "deleteme_files/rstudio_leaflet-1.3.1/images/1px.png"
[16] "deleteme_files/rstudio_leaflet-1.3.1/rstudio_leaflet.css"
Ключом к разгадке причины является сообщение об ошибке, возвращенное после запуска функции saveWidget (хотя предоставленная веб-ссылка больше не работает). В сообщении об ошибке указывается, что функция htmlwidgets::saveWidget требует pandoc.exe приложение должно быть доступно для создания одного файла html. Если он недоступен, он создает html-файл с несколькими файлами.
Но у меня есть pandoc.exe установлен, так как он поставляется с пакетом RStudio, которым я постоянно пользуюсь.
Как выясняется, наличие pandoc.exe проверяется htmlwidgets::saveWidget с помощью функции rmarkdown::find_pandoc. Это проверяет наличие pandoc.exe в путях, сохраненных в переменных среды «RSTUDIO_PANDOC» и «ПУТЬ», а также в каталоге ~/opt/pandoc/.
При использовании RStudio переменная среды «RSTUDIO_PANDOC» устанавливается автоматически. Он не устанавливается, когда я запускаю сценарий через планировщик задач, так как в этом случае я использую Rscript.exe. Когда pandoc.exe установлена (она входит в комплект RStudio) переменная среды PATH не задана, поэтому ее также нельзя найти таким образом.
Итак, как мне получить saveWidget для сохранения в одном html-файле, когда я не использую RStudio?
Ответ №1:
Одним из решений является явное задание переменной среды RSTUDIO_PANDOC. Альтернативно pandoc.exe можно добавить в переменную среды PATH. Любое из вышеперечисленного может быть добавлено к .Файл Renviron. Вот пример первого подхода:
> library(leaflet)
> library(htmlwidgets)
> map <- leaflet::leaflet() %>% addTiles() %>% setView(lng=172.4,lat=-41,zoom=6)
> Sys.setenv(RSTUDIO_PANDOC = "C:/Program Files/RStudio/bin/pandoc")
> saveWidget(map,file="deleteme.html",selfcontained=TRUE)
> list.files(getwd(),full.names=FALSE, recursive=TRUE)
[1] "deleteme.html"