当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"
我认识到,最简单的解决方案是完全绕过x1
和x2
:
vars <- c("disp", "hp")
for (x in vars){
print(x)
}
但这没什么用,因为在我的(未简化的)问题中使用x1
,x2
等将非常有帮助。
另外,如果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创建
答案 0 :(得分:2)
您最初的问题的答案是使用get
。但是,由于您想做些其他事情,并且想按原样使用vars
,因此我们可以将get
与as.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)
我们可以使用lapply
和base 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))