簡體   English   中英

在 R 中使用函數指定參數名稱

[英]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.

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