У меня есть dataframe с набором объектов df$data
и набором правил для применения к каждому объекту df$rules
.
df <- data.frame(
data = c(1,2,3),
rules = c("rule1", "rule1, rule2, rule3", "rule3, rule2"),
stringsAsFactors = FALSE
)
Правила
rule1 <- function(data) {
data * 2
}
rule2 <- function(data) {
data + 1
}
rule3 <- function(data) {
data ^ 3
}
Для каждой строки в ядре данных я хочу применить все правила, указанные в столбце rules
. Правила должны применяться последовательно.
Что я понял:
apply_rules <- function(data, rules) {
for (i in 1:length(data)) {
rules_now <- unlist(strsplit(rules[i], ", "))
for (j in 1:length(rules_now)) {
data[i] <- apply_rule(data[i], rules_now[j])
}
}
return(data)
}
apply_rule <- function(data, rule) {
return(sapply(data, rule))
}
apply_rules(df$data, df$rules)
# [1] 2 125 28
Хотя это работает, я уверен, что должны быть более элегантные решения. На SO я мог бы найти много материала о apply
-functions, а также один посте о применении многих функций к вектору и что - то о цепочках функций. Идея Compose
выглядит многообещающе, но я не мог понять, как сделать вызов Compose
с моими правилами как строки. (parse()
не работает..)
Любые намеки?