Как заставить saveWidget создать один файл за пределами RStudio?

#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"