我正在嘗試撰寫一個函式,它將檔案夾名稱和變數名稱作為傳遞給 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在這個環境中,同為Y X。雖然該函式不起作用,但基本加載函式會加載環境中名為 rdata 的變數,并分別加載 x 和 y 的值。
我試圖了解 deparse(substitute()) 在這里是如何作業的。另外,是什么導致了在我的函式中用引數變數名替換真實變數名的加載問題?
uj5u.com熱心網友回復:
您需要對save和load功能進行更改。list在save函式中使用引數以與傳遞的值相同的變數名保存資料。
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用戶定義的函式內部的函式和函式如何作業有關。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318479.html
上一篇:如何使用mapvalues函式來更改特定列內的值?(使用R)
下一篇:高級R函式呼叫
