Сплайсинг без кавычек (rlang's !!!
) хорошо подходит для этой задачи.
library(tidyverse)
dat <-
data_frame(
id = 0:4,
brand = c(NA, 'coke', 'pepsi', 'other', 'pepsi'),
price = as.character(c(NA, 1, 1.10, 1.25, .99))
)
defs <-
data_frame(
feature_name = c("intercept", "brand_coke", "brand_pepsi", "price"),
feature_definition =
c("as.numeric(id != 0)", "as.numeric(brand == 'coke')",
"as.numeric(brand == 'pepsi')", "as.numeric(price)")
)
По сути, вы пытаетесь сделать следующее (я думаю?):
dat %>%
transmute(
intercept = as.numeric(id != 0),
brand_coke = as.numeric(brand == 'coke'),
brand_pepsi = as.numeric(brand == 'pepsi'),
price = as.numeric(price)
)
Что эквивалентно сначала захвату цитируемых выражений, а затем объединению их в ...
из dplyr::transmute
:
quosures1 <-
quos(
intercept = as.numeric(id != 0),
brand_coke = as.numeric(brand == 'coke'),
brand_pepsi = as.numeric(brand == 'pepsi'),
price = as.numeric(price)
)
transmute(dat, !!! quosures1)
Но ваши выражения хранятся в виде строк, поэтому они должны быть проанализированы в выражения, которые затем можно заключить в кавычки. Здесь я сопоставляю строки, чтобы создать список выражений, которые я разделяю на quos
, чтобы составить список предложений. Я называю элементы списка так, чтобы они использовались как имена LHS в transmute
:
quosures2 <-
quos(!!! map(defs$feature_definition, rlang::parse_expr)) %>%
set_names(defs$feature_name)
transmute(dat, !!! quosures2)
Конечно, я думаю, что в будущем вам будет легче читать первую версию (без кавычек и сплайсинга), но если вы хотите уменьшить дублирование кода, я мог бы увидеть аргумент для второго примера (quosures1
). По этой причине я стараюсь не хранить выражения в виде строк.