在R中的foreach循环中获取相应的变量名

在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

如果我有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(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)))
})