在R中的foreach循环中获取相应的变量名
如果我有4个不同的变量V1、V2、V3、V4,并且我想轻松地迭代它们,那么我可以使用cV1、V2、V3、V4中的forvar方法。有没有什么方法可以将一个函数应用于返回它所表示的变量的var?例如,调用这个函数f,代码在R中的foreach循环中获取相应的变量名,r,R,如果我有4个不同的变量V1、V2、V3、V4,并且我想轻松地迭代它们,那么我可以使用cV1、V2、V3、V4中的forvar方法。有没有什么方法可以将一个函数应用于返回它所表示的变量的var?例如,调用这个函数f,代码 for(var in c(V1, V2, V3, V4)) print(f(var)) 应打印V1V2V3V4 似乎不太可能存在这样一个函数,但我希望这里有人能给出一个明确的答案 也许您想将变量分组到某种结构中,比如一个列表,然后循环遍历列表中的元素 v1=rnorm(10
for(var in c(V1, V2, V3, V4))
print(f(var))
应打印V1V2V3V4
似乎不太可能存在这样一个函数,但我希望这里有人能给出一个明确的答案 也许您想将变量分组到某种结构中,比如一个列表,然后循环遍历列表中的元素
v1=rnorm(1030)
v2=rnorm(1330)
v3=rnorm(130)
varlist=list(Vee1=v1,Bee2=v2,vi3=v3)
for(i in 1:length(varlist)) {
assign( paste( names(varlist)[i],
"meanish",
sep=""),
mean(varlist[[i]]))
}
然后在ls中查看您拥有的内容。也许您希望将变量分组到某种结构中,比如列表,然后循环遍历列表中的元素
v1=rnorm(1030)
v2=rnorm(1330)
v3=rnorm(130)
varlist=list(Vee1=v1,Bee2=v2,vi3=v3)
for(i in 1:length(varlist)) {
assign( paste( names(varlist)[i],
"meanish",
sep=""),
mean(varlist[[i]]))
}
然后在ls中查看您拥有的内容。我想您可能想要这样的内容:
f <- function( ... ){
args <- all.vars(match.call())
x <- mget(args , envir = sys.frame())
return( paste0( args , ": " , x ) )
}
V1 <- 1
V2 <- 2
V3 <- 3
f(V1 , V2 , V3)
# [1] "V1: 1" "V2: 2" "V3: 3"
在上面的示例中,我们应用幂函数^,并传递额外的参数2,即x^2,其中x是列表中的每个元素。我想您可能想要这样的结果:
f <- function( ... ){
args <- all.vars(match.call())
x <- mget(args , envir = sys.frame())
return( paste0( args , ": " , x ) )
}
V1 <- 1
V2 <- 2
V3 <- 3
f(V1 , V2 , V3)
# [1] "V1: 1" "V2: 2" "V3: 3"
在上面的示例中,我们应用幂函数,并传递附加参数2,即x^2,其中x是列表中的每个元素。我经常遇到这种情况 我的策略是迭代变量名,然后使用get 例如:
我经常遇到这种情况 我的策略是迭代变量名,然后使用get 例如:
rownames/colnames是否适用于您的特定情况?您可能需要将for循环重新构造为矩阵操作,但这看起来更像r。cV1、V2、V3、V4是命名向量吗,即myvec i应该更清楚。我想同时讨论实际应用于var本身的东西。例如,考虑F@ JonClaus是否有帮助的解决方案?因为你是新来的,你可能想读一读关于它是如何工作的。我注意到你只投过一票,只接受过一个答案。如果当你收到解决问题的答案时,你通过点击小复选标记来接受,那么S.O.对每个人来说都更有价值。您完全没有义务这样做,但如果答案确实解决了您的问题,那么这是一种很好的回馈网站的方式。rownames/colnames在您的特定情况下有效吗?您可能需要将for循环重新构造为矩阵操作,但这看起来更像r。cV1、V2、V3、V4是命名向量吗,即myvec i应该更清楚。我想同时讨论实际应用于var本身的东西。例如,考虑F@ JonClaus是否有帮助的解决方案?因为你是新来的,你可能想读一读关于它是如何工作的。我注意到你只投过一票,只接受过一个答案。如果当你收到解决问题的答案时,你通过点击小复选标记来接受,那么S.O.对每个人来说都更有价值。你完全没有义务这样做,但如果答案确实解决了你的问题,这是一个很好的回馈网站的方式。如果你将你的元素分组到一个列表中,你最好使用Lappy循环列表中的元素,除非你真的需要使用它,因为它的副作用。在这个例子中,我真的会使用sapply varlist,mean,use.NAMES=TRUE。这将返回命名向量中的平均值。@SimonO101,有什么副作用?@RicardoSaporta我的意思是,当你调用一个函数来获取它的返回值以外的值时。当您使用for时,它通常用于以迭代方式修改现有对象。e、 g.在循环之前实例化一个空的data.frame,并使用循环填充每一行,这是我避免的,但for循环的一种方式通常用于它的副作用。或者assign函数将是另一个很好的例子。如果您将元素分组到一个列表中,则最好使用Lappy循环列表中的元素,除非您确实需要使用for,因为它会产生副作用。在这个例子中,我真的会使用sapply varlist,mean,use.NAMES=TRUE。这将返回命名向量中的平均值。@SimonO101,有什么副作用?@RicardoSaporta我的意思是,当你调用一个函数来获取它的返回值以外的值时。当您使用for时,它通常用于以迭代方式修改现有对象。e、 g.在循环之前实例化一个空的data.frame,并使用循环填充每一行,这是我避免的,但for循环的一种方式通常用于它的副作用。或者,赋值函数将是另一个很好的例子。
lapply(c("V1", "V2", "V3", "V4"), print)
#- or -#
lapply(c("V1", "V2", "V3", "V4"), function(v) {
print(v)
someActionOn(get(v)))
})