R 用户定义的保存加载函数 |使用 deparse(substitute) 将变量名作为参数传递

R user-defined save load functions | Passing variable names as arguments using deparse(substitute)

我正在尝试编写一个函数,将文件夹名称和变量名称作为参数传递给 R 的 save/load 函数。根据其他帖子的评论,我使用 deparse(substitute(variable name)) 将变量名作为参数名传递。

试用:我工作目录下的文件夹名为SData,变量为x和y;我想为每个 x 和 y 创建一个 .RData 文件。

x <- 1:100
y <- "string"

getSave <- function(folder, rdata){
    save(rdata, file = paste0("./", deparse(substitute(folder)), "/", 
                              deparse(substitute(rdata)), ".RData"))
}

getSave(SData, x)
getSave(SData, y)

这些文件保存为 x.RData 和 y.RData,如我所愿。现在,让我们清除环境并使用类似的函数加载数据:

rm(x, y)

getLoad <- function(folder, rdata){
    load(paste0("./", deparse(substitute(folder)), "/",
                deparse(substitute(rdata)), ".RData"))
}

getLoad(SData, x) # does not work
getLoad(SData, y) # does not work

load("./SData/x.RData") # loads x but with variable name rdata
load("./SData/y.RData") # loads y but with variable name rdata

getLoad() 应该在环境中将 x.RData 加载为 x,y 也一样。虽然该函数不起作用,但基本加载函数会加载环境中名为 rdata 的两个变量,分别为 x 和 y 的值。

我想了解 deparse(substitute()) 在这里是如何工作的。另外,是什么导致了这个加载问题,即在我的函数中用参数变量名替换了真实变量名?

您需要在 saveload 函数中进行更改。在 save 函数中使用 list 参数,以与传递值相同的变量名保存数据。

getSave <- function(folder, rdata){
  val <- deparse(substitute(rdata))

  save(list = val, 
       file = paste0("./", deparse(substitute(folder)), "/", val, ".RData"))
}

getSave(SData, x)
getSave(SData, y)

要加载数据,请将环境指定为全局环境,因为默认情况下会在调用的环境中加载值。由于默认情况下您在函数中加载数据,因此值仅在函数内部加载。

getLoad <- function(folder, rdata){
  load(paste0("./", deparse(substitute(folder)), "/", deparse(substitute(rdata)), ".RData"), 
       envir = .GlobalEnv)
}

getLoad(SData, x)
getLoad(SData, y)

所以这个问题与 deparsesubstitue 无关,而是 saveload 函数如何在用户定义的函数中工作。