сохранить виджет из htmlwidget в R, невозможно сохранить html-файл в другой папке

У меня есть листовка с картой, которую я хочу сохранить в html-файле в определенной папке. Я использую Windows 7.

Я пробовал следующее:

library(htmlwidgets)
saveWidget(map_leaflet, file="ressources/test.html")

library(htmlwidgets)
saveWidget(map_leaflet, file="ressources\\test.html")

library(htmlwidgets)
path_name <- file.path("ressources", "test.html", fsep="\\")
saveWidget(map_leaflet, file=path_name)

library(htmlwidgets)
path_name <- paste("ressources", "test.html", sep="/")
saveWidget(map_leaflet, file=path_name)

В качестве сообщения об ошибке, в зависимости от сеанса Rstudio, у меня либо есть

1) Ошибка в setwd(dir): невозможно изменить рабочий каталог

2) Не могу найти путь

Когда я сохраняю только так:

library(htmlwidgets)
saveWidget(map_leaflet, file="test.html")

Это работает отлично.

Спасибо заранее за вашу помощь.


person tuttifolies    schedule 30.12.2016    source источник
comment
похоже, что каталог ressources не существует из места, где выполняется код. Вы пытались проверить getwd() в R непосредственно перед запуском этого кода, чтобы убедиться, что вы запускаете его из правильного каталога, и dir(), чтобы убедиться, что ressources существует в этом месте? Если оба они выглядят правильно, менее благоприятным решением может быть использование setwd("ressources") для перехода в этот каталог перед попыткой сохранения.   -  person user5359531    schedule 30.12.2016
comment
Привет, я попробовал getwd() и dir(), и ресурсы отображаются правильно. Затем я попробовал это path <- file.path(getwd(), "ressources", "test.html") saveWidget(map_leaflet, file=path), и на этот раз он работает отлично. Я думаю, ему просто нужен был полный путь. Можете ли вы сделать свой комментарий в качестве ответа, чтобы я мог пометить вопрос как отвеченный? Спасибо   -  person tuttifolies    schedule 31.12.2016
comment
Мои советы касались только устранения неполадок. Это все еще звучит так, как будто вы не выполняете код там, где вы думаете. Но, как вы обнаружили, использование полных путей и использование file.path() являются более надежными способами безопасного прохождения путей. Вы также можете взглянуть на функцию normalizePath(). Это может помочь вам получить абсолютный путь, а также может сообщить вам, если путь не существует или неверен. Попробуйте эти и вы увидите: normalizePath("."), normalizePath("~"), normalizePath("./foo") ‹- выдаст ошибку, если foo не существует. Также вы можете просто не использовать относительные пути для file=   -  person user5359531    schedule 02.01.2017


Ответы (2)


Согласованный.

вот обходной путь:

f<-"ressources\\test.html"
saveWidget(map_leaflet,file.path(normalizePath(dirname(f)),basename(f)))

Проблема заключается в том, что saveWidget не работает с относительными путями, а normalizePath не работает с путями к уже существующим файлам.

Я бы назвал это ошибкой в ​​saveWidget.

редактировать:

Я внес свой вклад в решение существующей открытой проблемы, что, по моему мнению, является еще лучшим обходным путем.

person malcook    schedule 20.07.2017

Для этого я использую функцию with_dir в пакете withr. Я также поместил его в функцию-оболочку:

save_leaflet <- function(plot, file, overwrite = FALSE){
  # save the file if it doesn't already exist or if overwrite == TRUE
  if( !file.exists(file) | overwrite ){
    withr::with_dir(new = dirname(file), 
                    code = htmlwidgets::saveWidget(plot, 
                                                   file = basename(file)))
  } else {
    print("File already exists and 'overwrite' == FALSE. Nothing saved to file.")
  }
}
person filups21    schedule 29.10.2020