我创建了一个将数据保存到特定位置的功能,该功能在启动rstudio时作为软件包的一部分加载:
save_data <- function(fileName, file_name){
file_path <- paste0("~/", file_name)
save(list=deparse(substitute(fileName)), file=file_path)
}
但是从另一个函数内部调用此函数时,它将返回“错误保存以下文件:...”。
为重现该问题,我创建了一个savetest函数:
savetest <- function(fileName){
data1 <- fileName * 10
save_data(data1, file_name = "test.RData")
data1
}
和一个小的savetestscript:
source("savetestfunction.R")
x <- c(1:10)
data1 <- savetest(x)
我花了很长时间假设问题是由环境引起的,并且从每个环境中看到了什么(例如,在启动时加载的save_data函数无法看到调用savetestfunction时创建的临时环境),但是作为测试,我尝试添加一个print(fileName)
到save_data函数,令我惊讶的是,它实际上可以看到此时的fileName。
解决方法:我更新了该函数,以便它在save_data函数创建的环境中分配了FileName,现在它可以按预期的方式运行...
save_data <- function(fileName, file_name){
file_path <- paste0("//placeholder//", file_name)
assign(deparse(substitute(fileName)), fileName)
save(list=deparse(substitute(fileName)), file=file_path)
}
困惑:然后,这使我相信fileName在保存时可能是一个承诺,但是save()包含一个参数eval.promises,默认情况下为True,所以不可能是这样!
问题:造成此问题的原因是什么? (与环境有关的混乱吗?承诺吗?)为避免这种情况可以采取什么措施?
编辑:尝试使用saveRDS,但没有成功。更感兴趣的是,为什么保存首先不能起作用,而不是真正的解决方案,因为save_data函数中的赋值已经使它起作用了。