R 将变量传递给自定义函数 purrr
R Pass Variables into a custom function purrr
如何格式化自定义函数以将变量传递给 h2o 函数?我想不出正确的 quo/expr/ensym 语法。
这是一个我无法理解的语法的小例子:
suppressMessages(library(h2o))
#> Warning: package 'h2o' was built under R version 3.6.2
suppressMessages(library(rlang))
h2o.init()
#> Connection successful!
data_h2o <- as.h2o(iris)
h2o.cor(data_h2o$Sepal.Length, data_h2o$Sepal.Width, use = "everything", method = "Pearson")
#> [1] -0.1175698
# function to take two variables and return the correlation
## in a larger data set I only care about how the target variable
## relates to the dependent variables
cor_function <- function(var1, var2) {
var_1 = deparse(substitute(var1))
var_2 = deparse(substitute(var2))
r = h2o::h2o.cor(data_h2o[[var_1]], data_h2o[[var_2]], use = "complete.obs", na.rm = TRUE, method = "spearman")
out <- tibble::enframe(r, name = NULL)
out$var1 = var_1
out$var2 = var_2
return(r)
}
# this works
cor_function(Sepal.Length, Sepal.Width)
#> [1] -0.1795433
params_to_run <- expand.grid(var1 = "Sepal.Length", var2 = c("Sepal.Width", "Petal.Width"))
suppressMessages(library(purrr))
purrr::map(params_to_run, cor_funtion)
#> Error in if ((nrow(x) == 1L || (ncol(x) == 1L && ncol(y) == 1L))) .eval.scalar(expr) else .fetch.data(expr, : missing value where TRUE/FALSE needed
由 reprex package (v0.3.0)
于 2020-02-03 创建
这与其他问题相似w/o答案:
- How to pass variable name to custom function having h2o function
- How to pass dynamic column name to h2o arrange function
我认为这里有几个问题,最重要的一个是混合整洁和标准评价。在 cor_function(Sepal.Length, Sepal.Width)
中,参数作为表达式传递,而在 params_to_run
中的元素是字符串(实际上是因子)。
因为我看不出 tidy evaluation 在这里真的有必要,而且 map
ping 字符串感觉更自然,我提出了一个没有 tidy evaluation 的解决方案。
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
是一个数据框,您想要跨行循环。 map()
会跨列循环(如 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
在下面,您会找到一个带有 tidy 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
由 reprex package (v0.3.0)
于 2020-02-04 创建
如何格式化自定义函数以将变量传递给 h2o 函数?我想不出正确的 quo/expr/ensym 语法。
这是一个我无法理解的语法的小例子:
suppressMessages(library(h2o))
#> Warning: package 'h2o' was built under R version 3.6.2
suppressMessages(library(rlang))
h2o.init()
#> Connection successful!
data_h2o <- as.h2o(iris)
h2o.cor(data_h2o$Sepal.Length, data_h2o$Sepal.Width, use = "everything", method = "Pearson")
#> [1] -0.1175698
# function to take two variables and return the correlation
## in a larger data set I only care about how the target variable
## relates to the dependent variables
cor_function <- function(var1, var2) {
var_1 = deparse(substitute(var1))
var_2 = deparse(substitute(var2))
r = h2o::h2o.cor(data_h2o[[var_1]], data_h2o[[var_2]], use = "complete.obs", na.rm = TRUE, method = "spearman")
out <- tibble::enframe(r, name = NULL)
out$var1 = var_1
out$var2 = var_2
return(r)
}
# this works
cor_function(Sepal.Length, Sepal.Width)
#> [1] -0.1795433
params_to_run <- expand.grid(var1 = "Sepal.Length", var2 = c("Sepal.Width", "Petal.Width"))
suppressMessages(library(purrr))
purrr::map(params_to_run, cor_funtion)
#> Error in if ((nrow(x) == 1L || (ncol(x) == 1L && ncol(y) == 1L))) .eval.scalar(expr) else .fetch.data(expr, : missing value where TRUE/FALSE needed
由 reprex package (v0.3.0)
于 2020-02-03 创建这与其他问题相似w/o答案:
- How to pass variable name to custom function having h2o function
- How to pass dynamic column name to h2o arrange function
我认为这里有几个问题,最重要的一个是混合整洁和标准评价。在 cor_function(Sepal.Length, Sepal.Width)
中,参数作为表达式传递,而在 params_to_run
中的元素是字符串(实际上是因子)。
因为我看不出 tidy evaluation 在这里真的有必要,而且 map
ping 字符串感觉更自然,我提出了一个没有 tidy evaluation 的解决方案。
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
是一个数据框,您想要跨行循环。 map()
会跨列循环(如 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
在下面,您会找到一个带有 tidy 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
由 reprex package (v0.3.0)
于 2020-02-04 创建