Я не думаю, что вы можете сделать это без setwd
, но вам не нужно сохранять это.
my_file_chooser <- function(d = getwd()) {
curdir <- getwd()
message("Currently in ", curdir)
on.exit({
setwd(curdir)
message("Returning to ", curdir)
}, add = TRUE)
setwd(d)
message("Showing file dialog in ", getwd())
file.choose()
}
my_file_chooser(system.file(package = "dplyr"))
# Currently in C:/Users/r2/StackOverflow
# Showing file dialog in C:/Users/r2/R/win-library/3.5/dplyr
![file choose dialog](https://i.stack.imgur.com/8l9bZ.png)
# Returning to C:/Users/r2/StackOverflow
# [1] "C:\\Users\\r2\\R\\win-library\\3.5\\dplyr\\doc\\compatibility.Rmd"
getwd()
# [1] "C:/Users/r2/StackOverflow"
(Вы, вероятно, должны удалить все message
s перед развертыванием подобной функции.)
Это фактически то, что делает withr::with_dir
, хотя и позволяет выполнять произвольный код. Если вы не возражаете против другого пакета (который может быть установлен в любом случае):
getwd()
# [1] "C:/Users/r2/StackOverflow"
withr::with_dir(system.file(package = "dplyr"), file.choose())
# [1] "C:\\Users\\r2\\R\\win-library\\3.5\\dplyr\\doc\\dplyr.html"
getwd()
# [1] "C:/Users/r2/StackOverflow"