簡體   English   中英

R:使用公式表示法定義 function,如 purrr::map(.f=)

[英]R: Use formula notation to define a function, like purrr::map(.f=)

在gtsummary package中,有很多函數取其他函數為arguments。 目前,用戶必須傳遞正確的 function,但我想更新以允許用戶使用公式語法傳遞具有快捷符號的函數(類似於purrr::map()允許用戶傳遞purrr::map(.f = mean)purrr::map(.f = ~mean(.x)) 。整個 tidyverse 中還有其他函數,例如,在 dplyr 中使用類似的符號。這是purrr::map()的描述幫助文件:

在此處輸入圖像描述

我寫了一個小的 function 將公式語法轉換為新的 function。 但是,這只接受點符號(例如~mean(.) )。 我如何將其概括為接受. .x..1 在我的用例中,我需要使用foo(1:5)調用它們(不引用參數名稱),並且 function 將只有一個參數。

# convert a formula to a function
formula_to_function <- function(x) {
  function(.) eval(rlang::f_rhs(x), list(.))
}

# create a new function that is the mean of a vector
foo <- formula_to_function(~mean(., na.rm= TRUE))

# evaluate function
foo(1:5)
#> [1] 3

代表 package (v0.3.0) 於 2020 年 7 月 3 日創建

謝謝!

在內部, purrr::map使用purrr::as_mapper.f參數解析為 function。 這里(第 110 行)。 所以一種選擇是在你的 function 中直接使用purrr::as_mapper ,或者你可以嘗試自己重寫as_mapper (這里是實現)。

gsubfn 中的match.funfn類似於基礎 R 中的match.fun ,除了它也接受一個公式。 該公式可以使用任何變量,並且任何自由變量(使用但未定義)都假定為 arguments 遇到的順序。

library(gsubfn)

f <- function(x, y, z, fun) {
  fun <- match.funfn(fun)
  fun(x, y, z)
}

# test
f(1, 2, 3, ~ a + b + c)
## [1] 6

或者,您可以在公式的 LHS 上指定 arguments

# same
f(1, 2, 3, a + b + c ~ a + b + c)
## [1] 6

或通過 function

# same
f(1, 2, 3, function(a, b, c) a + b + c)
## [1] 6

還有其他功能,請參閱 gsubfn package 文檔了解更多信息。

也可以通過使用fn$調用的 function 將公式作為 function arguments 傳遞給一般函數。

library(gsubfn)

f2 <- function(x, y, z, fun) {
  fun(x, y, z)
}

fn$f2(1, 2, 3, ~ a + b + c)
## [1] 6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM