簡體   English   中英

如何在R中顯式調用函數參數的默認值?

[英]How to explicitly call the default value of a function argument in R?

如何在沒有i)省略函數調用中的參數和ii)不知道默認值是什么的情況下告訴R使用函數參數的默認值?

我知道我可以在rnorm()使用mean的默認值:

rnorm(n = 100) # by omitting the argument
# or
rnorm(n = 100, mean = 0) # by including it in the call with the default value

但假設我不知道默認值,但希望在函數調用中明確包含它。 我怎樣才能做到這一點?

您可以通過以下方式訪問參數列表和默認值:

> formals(rnorm)
$n


$mean
[1] 0

$sd
[1] 1

formals("rnorm")也有效。 一些簡單的例子:

> rnorm(10,mean = formals(rnorm)$mean)
 [1] -0.5376897  0.4372421  0.3449424 -0.9569394 -1.1459726 -0.6109554  0.1907090  0.2991381 -0.2713715
[10] -1.4462570
> rnorm(10,mean = formals(rnorm)$mean + 3)
 [1] 2.701544 2.863189 1.709289 2.987687 2.848045 5.136735 2.559616 3.827967 3.079658 5.016970

顯然,你也可以提前存儲形式formals(rnorm)的結果。

正如@joran已經指出的那樣, formals()公開了默認值。 但是,正如我理解的那樣,你真正追求的是構建調用表達式 為此,將formals()as.call()結合起來生成調用本身很有用。 以下函數通過為給定的函數名f生成一個產生“參數完成的調用”的函數來實現這一點:

drop_missing <- function(sig) {
  sig[!sapply(sig, identical, quote(expr =))]
}

complete_call <- function(f) {
  nm <- as.name(f)
  sig <- formals(args(f))
  make_call <- function() {
    args <- match.call()[-1]
    sig[names(args)] <- args
    as.call(c(nm, drop_missing(sig)))
  }
  formals(make_call) <- sig
  make_call
}

用法示例:

complete_call("log")(1)
#> log(x = 1, base = exp(1))

complete_call("rnorm")(10)
#> rnorm(n = 10, mean = 0, sd = 1)

complete_call("rnorm")()
#> rnorm(mean = 0, sd = 1)

備注:

1)輸出是語言對象。 要執行調用,您需要對其進行評估,例如,

eval(complete_call("rnorm")(10))
#> [1] -0.89428324 -1.78405483 -1.83972728 ... (output truncated)

2)如果你想要complete_call()接受一個函數,而不是一個函數的名字,你可以寫nm <- as.name(deparse(substitute(f)))來代替給定的賦值。 然而,將不可能在一個嵌套調用,在那里你會得到工作as.name("f")nm ,因為討論R的規則FO詞匯范圍。

3)如果沒有在sig的賦值中調用args() ,則complete_call()僅適用於閉包,因為原始函數和內置函數沒有形式。

暫無
暫無

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

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