目前,至少,这对我来说是一个学习练习,因此实际功能或其复杂性不是问题。假设我编写了一个函数,它的参数列表包括一些输入变量和一个函数名,作为字符串传递。然后这个函数在内部计算一些变量并“决定”如何将它们提供给我传入的函数名称。
对于非原始函数,我可以这样做(对于这个例子,假设我的 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)
}
好消息是,即使函数
funcname
即使不使用 x
也不会出错, y
或 z
(只要没有其他没有默认值的参数)。“原始”函数的问题是我不知道找到或修改它们的形式的任何方法。除了编写包装器,例如
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
#
#
# $...
关于r - 如何检索原始函数的形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25978301/