目前,至少,这是一个为我学习的练习,所以实际功能或其复杂性不是问题.假设我编写了一个函数,其参数列表包含一些输入变量和一个函数名,作为字符串传递.然后,此函数在内部计算一些变量,并"决定"如何将它们提供给我传入的函数名称.
对于非原始函数,我可以这样做(对于这个例子,假设我的funcname函数中没有任何参数除了最多(x,y,z).如果有,我必须编写一些代码来搜索匹配,names(formals(get(funcname)))以便不删除其他参数) :
foo <- function (a,b,funcname) {
x <- 2*a
y <- a+3*b
z <- -b
formals(get(funcname)) <- list(x=x, y=y, z=z)
bar <- get(funcname)()
return(bar)
}
Run Code Online (Sandbox Code Playgroud)
好的是,即使函数funcname没有错误也会执行,即使它没有使用x,y或者z(只要没有其他没有默认值的args).
"原始"功能的问题是我不知道找到或修改他们的形式的任何方法.除了编写包装器之外, foosin <-function(x) sin(x)有没有办法设置我的foo函数来处理原始和非原始函数名作为输入参数?
formals(args(FUN))可用于获取原始函数的形式。
您可以if向现有函数添加一条语句。
> formals(sum)
# NULL
> foo2 <- function(x) {
if(is.primitive(x)) formals(args(x)) else formals(x)
## formals(if(is.primitive(x)) args(x) else x) is another option
}
> foo2(sum)
# $...
#
#
# $na.rm
# [1] FALSE
#
> foo2(with)
# $data
#
#
# $expr
#
#
# $...
Run Code Online (Sandbox Code Playgroud)