我正在一个项目中,我必须对多个变量应用相同的转换。例如
a <- a + 1
b <- b + 1
d <- d + 1
e <- e + 1
我显然可以使用以下顺序执行操作
for (i in c(a, b, d, e)) i <- i + 1
但是,由于i
是每个变量的副本,而不是引用,因此我实际上不能以这种方式将结果分配给每个变量。
有没有办法做到这一点?显然,将变量合并到data.frame或其他内容中会更容易,但这是不可能的。
通常,如果您发现自己对多个对象执行相同的操作,则应将它们存储/考虑为带有子组件的单个对象。您说不可能将它们存储为data.frame,因此可以使用列表。这使您可以使用lapply
/ sapply
一步将功能应用于列表的每个元素。
a <- c(1, 2, 3)
b <- c(1, 4)
c <- 5
d <- rnorm(10)
e <- runif(5)
lstt <- list(a = a, b = b, c = c, d = d, e = e)
lstt$a
# [1] 1 2 3
lstt <- lapply(lstt, '+', 1)
lstt$a
# [1] 2 3 4
该问题指出要递增的变量不能具有较大的结构,但是在注释中指出,毕竟不是那样,因此我们将假定它们位于列表L
中。
L <- list(a = 1, b = 2, d = 3, e = 4) # test data
for(nm in names(L)) L[[nm]] <- L[[nm]] + 1
# or
L <- lapply(L, `+`, 1)
# or
L <- lapply(L, function(x) x + 1)
如果它们都是标量,则可以将它们放在普通矢量中:
v <- c(a = 1, b = 2, d = 3, e = 4)
v <- v + 1
如果它们都是相同长度的向量,则可以将它们放入数据帧中,或者如果它们也属于相同类型,则可以将它们放入矩阵中,在这种情况下,我们也可以将其加1。
如果变量在环境中确实必须是自由的,那么如果nms
是变量名的向量,那么我们可以遍历这些名称并使用这些名称为环境env
下标。如果名称遵循某种模式,我们也许可以使用nms <- ls(pattern = "...", envir = env)
,或者如果它们是该环境中的唯一变量,则可以使用nms <- ls(env)
。
a <- b <- d <- e <- 1 # test data
env <- .GlobalEnv # can change this if not being done in global envir
nms <- c("a", "b", "d", "e")
for(nm in nms) env[[nm]] <- env[[nm]] + 1
a;b;d;e # check
## [1] 2
## [1] 2
## [1] 2
## [1] 2