Я думаю, что здесь есть несколько проблем, самая важная из которых - это сочетание аккуратности и стандартной оценки. В cor_function(Sepal.Length, Sepal.Width)
аргументы передаются в виде выражений, тогда как элементы в params_to_run
являются строками (или факторами).
Поскольку я не вижу, что аккуратная оценка здесь действительно необходима, и map
ping поверх строк кажется более естественным, я предлагаю решение без аккуратной оценки.
library("h2o")
library("purrr")
library("dplyr")
h2o.init()
data_h2o <- as.h2o(iris)
params_to_run <- expand.grid(var1 = "Sepal.Length", var2 = c("Sepal.Width", "Petal.Width"))
params_to_run
#> var1 var2
#> 1 Sepal.Length Sepal.Width
#> 2 Sepal.Length Petal.Width
cor_fun <- function(data, x, y, FUN, ...) {
# as.character() because expand.grid() produces factors
r <- FUN(x = data[, as.character(x)], y = data[, as.character(y)], ...)
return(r)
}
cor_fun(iris, "Sepal.Length", "Sepal.Width", cor)
#> [1] -0.1175698
cor_fun(data_h2o, "Sepal.Length", "Sepal.Width", h2o.cor)
#> [1] -0.1175698
mutate(params_to_run, res = map2(var1, var2, ~cor_fun(data_h2o, .x, .y, h2o.cor)))
#> var1 var2 res
#> 1 Sepal.Length Sepal.Width -0.1175698
#> 2 Sepal.Length Petal.Width 0.8179411
? Обратите также внимание, что params_to_run
- это фрейм данных, и вы хотите l oop между строками. map()
будет l oop по столбцам (например, lapply()
), поэтому я использую mutate()
, чтобы применить map()
к каждой строке. Также обратите внимание, что cor_fun()
требуется два аргумента, поэтому используется map2()
.
В конце концов, можно даже сделать это без пользовательской функции cor_fun()
:
mutate(params_to_run,
res = map2(var1, var2, ~h2o.cor(x = data_h2o[, as.character(.x)],
y = data_h2o[, as.character(.y)])))
#> var1 var2 res
#> 1 Sepal.Length Sepal.Width -0.1175698
#> 2 Sepal.Length Petal.Width 0.8179411
Ниже Вы находите раствор с приборкой Eval. Однако, это не будет работать с params_to_run
, который содержит строки (или факторы, фактически).
cor_fun2 <- function(data, x, y, FUN, ...) {
x <- rlang::enquo(x)
y <- rlang::enquo(y)
r <- FUN(x = data[, quo_name(x)], y = data[, quo_name(y)], ...)
return(r)
}
cor_fun2(data_h2o, Sepal.Length, Sepal.Width, h2o::h2o.cor)
#> [1] -0.1175698
Создано в 2020-02-04 пакетом prex (v0.3.0)