[英]Pass rows of a data frame as arguments to a function in R with column names specifying the arguments
[英]Specifying names of arguments with a function in R
我想要做的是以下內容:我想編寫一個函數,讓我們用一個參數將其稱為“function_creator”:名稱和一些附加參數,這樣它的輸出就是一個函數,其參數名稱就是參數我傳遞給'function_creator'。
以下代碼片段說明了我希望 function_creator 的行為方式:
f <- function_creater(name = "y", y_min = 2, y_max = 3)
f
function(y) {
y >= 2 && y <= 3
}
我如何在 R 中做到這一點? 我想像 sys.call() 這樣的東西可能會有所幫助,但我真的不知道如何從那里開始。
有更好的方法可以做到這一點,但也有窮人的方法:用代碼創建一個字符串並解析/評估它。 我使用glue
來提高可讀性,但同樣的事情也可以用paste
來完成。
library(glue)
function_creator <- function(name = 'y', y_min = 2, y_max = 3){
code_string <-
glue('
function({name}){{
{name} >= {y_min} && {name} <= {y_max}
}}
')
eval(parse(text = code_string))
}
f <- function_creator(name = 'bob', y_min = 10, y_max = 20)
f(bob = 11) # TRUE
f(bob = 8) # FALSE
注意:使用膠水,{} 內的對象會被評估,結果將替換 {},例如, '{name}'
被替換為字符串中的'y'
。 由於這種替換方法,實際的 {s 和 }s 需要額外的 { 或 } 來轉義。
使用rlang::new_function()
你可以做到這一點。 這也使用rlang
exprs()
來創建一個沒有默認值的參數(即,一個沒有任何內容的命名列表。函數的主體放在substitute()
函數中以交換變量名稱的值.
library(rlang)
function_creater <- function(name, y_min, y_max) {
new_args <- setNames(exprs(temp_name = ), name)
new_body <- substitute((y >= y_min && y <= y_max), list(y = sym(name),
y_min = y_min,
y_max = y_max))
new_function(new_args, new_body)
}
測試:
> f <- function_creater(name = "y", y_min = 2, y_max = 3)
> f
function (y)
(y >= 2 && y <= 3)
<environment: 0x000000001af5f518>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.