我试图写一个函数,将文件夹名称和变量名称作为传入R的基本保存/加载函数的参数。我已经使用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的值。
我想了解dese (substitute())在这里是如何工作的。还有,是什么导致了这个加载问题与替代实际变量名与参数变量名在我的函数?
需要对save
和load
函数进行更改。在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)
因此,问题与deparse
,substitue
无关,而是与save
和load
函数如何在用户定义的函数中工作有关。