R 如何动态调用变量?

R 如何动态调用变量?,r,R,我正在做三个实验,我把它们存储在三个列表中:exp1、exp2和exp3。每个列表都有若干项(名称,条件,数据集a,数据集b,等等)。有时我想对所有的实验进行一次操作。有没有办法将它们的名称存储在变量中并动态调用它们?这不起作用: all_exp <- list(exp1=exp1,exp2=exp2,exp3=exp3) 但是必须有一种更简单的方法,而且,返回的列表会丢失实验名称。我想您需要 lapply(all_exp_names,get) 但这实际上并没有返回一个命名列表。你能行

我正在做三个实验,我把它们存储在三个列表中:
exp1
exp2
exp3
。每个列表都有若干项(
名称
条件
数据集a
数据集b
,等等)。有时我想对所有的实验进行一次操作。有没有办法将它们的名称存储在变量中并动态调用它们?这不起作用:

all_exp <- list(exp1=exp1,exp2=exp2,exp3=exp3)
但是必须有一种更简单的方法,而且,返回的列表会丢失实验名称。

我想您需要

lapply(all_exp_names,get)
但这实际上并没有返回一个命名列表。你能行

setNames(lapply(all_exp_names,get),all_exp_names)
这当然有点笨重,但如果你经常使用它,你可以将它打包成一个函数(请参阅@JoshOBrien的答案,以获得更好的解决方案)

我认为,更惯用的做法是首先将数据的引用副本保存在命名列表中

edit:下面我最初的延迟分配/评估代码很聪明,但完全没有注意到R有一个内置的
delayedAssign
函数,该函数与下面我的
makeDelayVar
函数的功能相同(但可能更强大):

delayedAssign("exp_all",list(exp1=exp1,exp2=exp2))

(感谢您指出这一点。)定义中缀运算符的诀窍
%如果您想保留名称,可以使用
sapply(…,simplify=FALSE,use.names=TRUE)


谢谢,我把事情弄得太复杂了。如果我按照惯用的方式,每次我想访问变量时,我都必须执行
all\u exp$exp1$whatever
,对吗?标准答案是使用
with()
,例如
with(all\u exp,exp1$whatever)
attach()
,如果你很有纪律的话[即,仅用于访问,不用于修改,并且在全局工作区和列表中不具有相同名称的变量],但通常不推荐使用。仅供参考,我在
delayedAssign("exp_all",list(exp1=exp1,exp2=exp2))
makeActiveBinding("all_exp",function() list(exp1=exp1,exp2=exp2), .GlobalEnv)
exp1 <- 2
exp2 <- 3
all_exp
## $exp1
## [1] 2
##  
## $exp2
## [1] 3
makeDelayVar <- function(var,val) {
   makeActiveBinding(deparse(substitute(var)), function() val, parent.frame())
}
makeDelayVar(all_exp, list(exp1=exp1,exp2=exp2))
all_exp
`%<%` <- makeDelayVar
all_exp %<% list(exp1,exp2)
A <- B <- C <- 1:4
nms <- c("A", "B", "C")

sapply(nms, get, simplify=FALSE, USE.NAMES=TRUE)
## $A
## [1] 1 2 3 4
## 
## $B
## [1] 1 2 3 4
## 
## $C
## [1] 1 2 3 4