Оценка индекса цикла как имени переменной, а не строки - PullRequest
0 голосов
/ 11 июля 2019

Я хотел бы оценить строку, например, 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 являетсялучший способ сделать что-то вроде этого, а не цикл, мне было бы очень интересно понять это лучше.

Если у кого-нибудь есть предложение относительно лучшего названия для вопроса, мне также будет очень интересно.

Более глубокий вопрос

Я упростил свой вопрос выше, надеясь, что этого будет достаточно, чтобы получить то, что мне нужно, ноt для контекста, я пытаюсь сделать что-то вроде этого:

df <- mtcars

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

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

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

Создано в 2019-07-11 пакетом prex (v0.2.1)

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

Мы можем использовать 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 голосов
/ 11 июля 2019

Ответ на ваш оригинальный вопрос заключается в использовании 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 голос
/ 11 июля 2019

Уже ответили, но:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...