从任何函数中提取函数参数和默认值

Posted

技术标签:

【中文标题】从任何函数中提取函数参数和默认值【英文标题】:Extract function parameters and default values from any function 【发布时间】:2016-07-31 17:03:05 【问题描述】:

有没有办法从函数外部提取任何给定函数的参数及其各自的默认值?

例如,给定:

myfunc <- function(a, b = 1)  print(c(a, b)) 

我正在寻找一些会返回的函数:

list(a = NULL, b = 1) 

或其一些变体。

【问题讨论】:

你为什么使用NULL 作为参数“a”? function(a, b = 1, c = NULL) 的结果是什么? 【参考方案1】:

您正在寻找formals()

formals(myfunc)
# $a
#
#
# $b
# [1] 1

如果你需要 NULL 来代替 a,你可以做一些检查。 a 将属于“名称”类并且为空。

lapply(formals(myfunc), function(x) if(is.name(x) & !nzchar(x)) NULL else x)
# $a
# NULL
#
# $b
# [1] 1

【讨论】:

可以使用missing(x) 来检测您所说的“空”。返回逻辑。我猜你首先尝试了is.null 并得到了一个错误,但missing 并没有尝试评估它的论点。 @42- - 你是什么意思?如果我这样做lapply(formals(myfunc), function(x) missing(x)),我都会得到 FALSE。 is.null() 也为两者返回 FALSE,因为 a 实际上不是 null,它是一个名称 "" myfunc &lt;- function(a,b=1)print(missing(a)); myfunc(); #TRUE 同意它不为 NULL。 missing 在函数内部具有意义,我认为用 lapply 逐一传递形式不会给出相同的信息。如果您将 missing 更改为 is.null 并运行它,您会得到一个错误而不是 TRUE。 OP 正在尝试从函数外部执行此操作。

以上是关于从任何函数中提取函数参数和默认值的主要内容,如果未能解决你的问题,请参考以下文章

函数之默认参数

C++核心编程中的函数-占位参数和默认参数

获取函数参数的默认值?

将列表对象作为函数参数传递(而不是默认值),是否有任何陷阱?

自学入门不在困难,初学者挑战学习Python编程30天

关于python带默认值的参数只能放在后面的问题