1

如果我有 4 个不同的变量 ( V1, V2, V3, V4) 并且我想轻松地迭代它们,我可以使用的一种方法是for(var in c(V1, V2, V3, V4)). 有什么方法可以将函数应用于var返回它代表的变量?比如调用这个函数f,代码

for(var in c(V1, V2, V3, V4))
  print(f(var))

应该打印V1V2V3V4

似乎不太可能存在这样的功能,但我希望这里有人能给出明确的答案。

4

3 回答 3

3

我经常遇到这种情况。

我的策略是遍历变量NAMES,然后使用get.

例如:

for(v in c("V1", "V2", "V3", "V4")){
   print(v)

  # then to operate on the variable
  var <- get(v)
}

一个额外的好处是你可以踢for循环并使用 nicelapply代替:

lapply(c("V1", "V2", "V3", "V4"),  print)


#- or -#

lapply(c("V1", "V2", "V3", "V4"), function(v) {
  print(v)
  someActionOn(get(v)))
})
于 2013-05-17T23:23:18.247 回答
2

我想你可能会追求这样的事情:

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"

match.call这从字符向量中提取参数的名称,然后使用这些名称在mget函数环境中查找附加到每个名称的值并将结果粘贴在一起。

但是,如果您有一个命名列表,您可以只使用sapplywithUSE.NAMES = TRUE来遍历列表的元素,并返回一个命名向量,作为对列表的每个元素应用某些函数的结果:

sapply( list( V1 = 1 , V2 = 2 , V3 = 3 , V4 = 4 ) , `^` , 2 )
#V1 V2 V3 V4 
# 1  4  9 16 

在上面的示例中,我们应用了幂函数^并传递了附加参数2,即列表中的每个元素在x^2哪里。x

于 2013-05-17T21:21:18.567 回答
0

也许你想将你的变量分组到某种结构中,比如一个列表,然后循环遍历列表的元素

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()你有什么。

于 2013-05-17T21:04:56.323 回答