关于R

时间:2019-01-04 15:17:41

标签: r function environment

我创建了一个将数据保存到特定位置的功能,该功能在启动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函数中的赋值已经使它起作用了。

0 个答案:

没有答案