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