Нестандартная оценка параметров точек
У меня есть функция, которую я хочу обернуть другой функцией, передавая аргументы как ...
параметры аргументов. У меня возникают проблемы с изучением, как структурировать основной вызов функции с lazyeval
Вот приличный MWE,
library(dplyr)
pythag <- function(a, b){
sqrt(a^2 + b^2)
}
pythag_wrapper <- function(data, ...){
dplyr::mutate_(data,
root = lazyeval::interp(~pythag(x), x = ...)
)
}
В этом мой pythag_wrapper
сделаю некоторые дополнительные данные. а также pythag
в моем случае есть много больше двух аргументов. Функция работает просто отлично, и как задумано.
test_data <- dplyr::data_frame(a = runif(10), b = runif(10), c = runif(10))
test_data %>%
dplyr::mutate(
root = pythag(a = b, b = c)
)
## # A tibble: 10 × 4
## a b c root
## <dbl> <dbl> <dbl> <dbl>
## 1 0.19805337 0.05567241 0.9956758 0.9972311
## 2 0.22642799 0.18871552 0.8690659 0.8893195
## 3 0.09352032 0.57328658 0.7475573 0.9420719
## 4 0.40589832 0.71270806 0.8014196 1.0724860
## 5 0.35896302 0.85889027 0.8197176 1.1872782
## 6 0.66409819 0.02206298 0.1304790 0.1323312
## 7 0.45102742 0.76048535 0.5501899 0.9386410
## 8 0.48249177 0.93670363 0.8280114 1.2502066
## 9 0.05545819 0.12281684 0.9219704 0.9301148
## 10 0.47588862 0.40196106 0.0192433 0.4024214
Я перепробовал все виды комбинаций lazyeval::interp
, lazy_eval::lazy_dots
и т. д., но я не могу понять, что именно должно произойти, тем более, как решить мою проблему.
pythag_wrapper(test_data, a = "a", b = "b")
## Error: object 'x' not found
1 ответ
Проблема в вашем коде в том, как вы справляетесь с аргументом dots ...
,
Немного изменив свой код и "вручную" переписав формулу внутри обёртки, она работает нормально:
pythag_wrapper <- function(data, ...){
# From ... argument get names and values
dots = list(...)
# 'Write' the formula: ' ~ pythag(a = val1, b = val2)'
yourformula = as.formula(
paste0(" ~ pythag(",
paste0(names(dots), " = ", unlist(dots), collapse = ", "),
")")
)
# Apply the mutate_. The setNames here is what you need to
# apply the right name to the resulting column
dplyr::mutate_(data, .dots = setNames(list(yourformula), 'root'))
}