将循环索引评估为变量名,而不是字符串

时间:2019-07-11 07:05:24

标签: r for-loop purrr

x1为循环索引时,我想将一个字符串,例如x1 <- "disp"评估为基础值,即disp,其中x1。 >

mtcars数据集为例的可复制示例如下:


x1 <- "disp"
x2 <- "hp"

vars <- c("x1", "x2")

for (x in vars){
  print(x)
}

哪个给我

#> [1] "x1"
#> [1] "x2"

所需结果:

我想要得到的是一个运行以下命令的循环:

print(x1)
print(x2)

导致:

#> [1] "disp"
#> [1] "hp"

我认识到,最简单的解决方案是完全绕过x1x2

vars <- c("disp", "hp")

for (x in vars){
  print(x)
}

但这没什么用,因为在我的(未简化的)问题中使用x1x2等将非常有帮助。

另外,如果purrr是执行类似操作的更好方法,而不是循环,那么我将非常有兴趣更好地理解它。

如果有人对这个问题有一个更好的标题的建议,我也会很感兴趣。

更深入的问题

我在上面简化了我的问题,希望能够满足我的需求,但是对于上下文,我正在尝试执行以下操作:

df <- mtcars

x1 <- "disp"
x2 <- "hp"

vars <- c("x1", "x2")

for (x in vars){
  lm(mpg ~ x, data = mtcars)
}

reprex package(v0.2.1)于2019-07-11创建

3 个答案:

答案 0 :(得分:2)

您最初的问题的答案是使用get。但是,由于您想做些其他事情,并且想按原样使用vars,因此我们可以将getas.formula

一起使用
lst <- vector("list", length(vars))
for (x in seq_along(vars)) { 
   lst[[x]] <- lm(as.formula(paste0("mpg ~", get(vars[x]))), mtcars)
}

#[[1]]

#Call:
#lm(formula = as.formula(paste0("mpg ~", get(vars[.x]))), data = mtcars)

#Coefficients:
#(Intercept)         disp  
#    29.5999      -0.0412  


#[[2]]

#Call:
#lm(formula = as.formula(paste0("mpg ~", get(vars[.x]))), data = mtcars)

#Coefficients:
#(Intercept)           hp  
#    30.0989      -0.0682  

使用purrr可以用map

purrr::map(seq_along(vars), ~lm(as.formula(paste0("mpg ~", get(vars[.x]))), mtcars))

答案 1 :(得分:2)

我们可以使用lapplybase R中的reformulate

lapply(mget(vars), function(x) 
       lm(reformulate(response = "mpg", termlabels = x), data = mtcars))
#$x1

#Call:
#lm(formula = reformulate(response = "mpg", termlabels = x), data = mtcars)

#Coefficients:
#(Intercept)         disp  
#   29.59985     -0.04122  


#$x2

#Call:
#lm(formula = reformulate(response = "mpg", termlabels = x), data = mtcars)

#Coefficients:
#(Intercept)           hp  
#   30.09886     -0.06823  

答案 2 :(得分:1)

已经回答,但是:

library(rlang)
library(tidyverse)

vars <- exprs(disp, hp) # without "character-quotes"
map(seq_along(vars), ~eval(expr(lm(mpg ~ !!vars[[.x]], mtcars))))

# or
vars <- c("disp", "hp")
map(vars, ~exec("lm", str_c("mpg ~ ", .x), data = mtcars))