В некотором роде от Cettt - что-то вроде этого может быть тем, что вы ищете:
df <- data.frame(x = c(1:5), y = c(6:10), z = LETTERS[1:5])
my_fxn <- function (aaa, bbb, ccc, data) {
if (!missing(data)) {
aaa = as.numeric(data[[aaa]])
bbb = as.numeric(data[[bbb]])
ccc = as.character(data[[ccc]])
}
print(aaa[1])
}
my_fxn("x", "y", "z", df)
#> [1] 1
При использовании enquo()
из library(dplyr)
нам больше не нужно вводить символы в качестве переменных функции:
library(dplyr)
my_fxn <- function (aaa, bbb, ccc, data) {
aaa <- enquo(aaa)
bbb <- enquo(bbb)
ccc <- enquo(ccc)
if (!missing(data)) {
aaa = as.numeric(pull(data, !!aaa))
bbb = as.numeric(pull(data, !!bbb))
ccc = as.character(pull(data, !!ccc))
}
print(aaa[1])
}
my_fxn(x, y, z, df)
#> [1] 1
Более подробную информацию о построении функций с enquo()
и !!
можно найти здесь: https://dplyr.tidyverse.org/articles/programming.html#programming-recipes
Наконец, решение base R с использованием deparse()
и substitute()
:
my_fxn <- function (aaa, bbb, ccc, data) {
aaa <- deparse(substitute(aaa))
bbb <- deparse(substitute(bbb))
ccc <- deparse(substitute(ccc))
if (!missing(data)) {
aaa = as.numeric(data[[aaa]])
bbb = as.numeric(data[[bbb]])
ccc = as.character(data[[ccc]])
}
print(aaa[1])
}
my_fxn(x, y, z, df)
#> [1] 1