Передача аргументов в подмножество внутри функции - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь разместить несколько разных моделей в одном наборе данных. Каждая из моделей использует различную комбинацию исходной переменной и подмножества данных. Чтобы соответствовать всем этим моделям, я создал фрейм данных с одним столбцом для переменной результата и одним столбцом, определяющим подмножество данных (в виде строки). (Обратите внимание, что подмножества перекрываются, поэтому не представляется очевидным способ сделать это с помощью nest ().) Затем я создал новую функцию, которая берет одну строку этого фрейма данных и вызывает «lm», используя эти параметры. Наконец, я использую pmap для отображения этой функции на фрейм данных.

После нескольких экспериментов я нашел подход, который работает, но он довольно не элегантен (см. Ниже упрощенную версию того, что я сделал). Похоже, должен быть способ передать условие подмножества в аргумент подмножества в lm, а не использовать parse (eval (text = condition)), чтобы сначала создать логический вектор. Я прочитал раздел Advanced R по метапрограммированию в надежде, что они дадут некоторое представление, но я не смог найти ничего, что работает.

Любые предложения будут полезны.

library(tidyverse)
outcomes <- c("mpg", "disp")
sub_conditions <- c("mtcars$cyl >=6", "mtcars$wt > 2")
models <- expand.grid(y = outcomes, condition = sub_conditions) %>% mutate_all(as.character)
fit <- function(y, condition) {
  # Create the formula to use in all models
  rx <- paste(y, "~ hp + am")
  log_vec <- eval(parse(text = condition))
  lm(rx, data = mtcars[log_vec,])
}
t <- pmap(models, fit) 

1 Ответ

0 голосов
/ 16 апреля 2020

Вы уверены, что хотите передать условия таким образом, используя строку?

Если это так, вариантов не так много. Вы можете использовать rlang::parse_expr в качестве альтернативы.

fit <- function(y, condition) {
   rx <- paste(y, "~ hp + am")
   lm(rx, data = mtcars[eval(rlang::parse_expr(condition)),])
}

и позвоните по номеру

purrr::pmap(models, fit) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...