2

当有一个 R 函数时,我的用法始终不同于默认值时,为了使我的代码简洁且易于维护,我喜欢在脚本开头执行以下操作(在此示例中,我使用ll()的是R.oo包裹):

> formals(ll.default)$private <- T;

这很好用。但是,现在我想创建一个函数从其...参数中读取的默认选项(在此示例中,我想将参数添加is.function=F到默认值,并且...是第二个形式参数)。有人知道该怎么做吗?我尝试了以下...

> formals(ll.default)[[2]]$is.function <-F
Error in formals(ll.default)[[2]]$is.function <- F : 
  argument "*tmp*" is missing, with no default

> formals(ll.default)$`...`$is.function <-F
Error in formals(ll.default)$...$is.function <- F : 
  argument "*tmp*" is missing, with no default

> formals(ll.default)$`...`<-alist(is.function=F)
> ll()
Error in ll.default() : '...' used in an incorrect context
> formals(ll.default)$`...`<-pairlist(is.function=F)
> ll()
Error in ll.default() : '...' used in an incorrect context

我查看了Defaults包裹,但文档说:

目前,无法为 . . . 参数,仅在原始函数定义中正式指定参数

有没有人知道一种方法来实现这一点,因为只有一个论点而没有编写包装器?

4

1 回答 1

2

您可以Curryfunctional库中使用:

library(functional)
> test <- function(private=FALSE,...) return(private)
> Curry(test,private=TRUE)
function (...) 
do.call(FUN, c(.orig, list(...)))
<environment: 0x4d0bed8>
> testP <- Curry(test,private=TRUE)
> testP()
[1] TRUE
> test()
[1] FALSE
> test2 <- function(...,private=FALSE) return(private)
> test2()
[1] FALSE
> test2P <- Curry(test2,private=TRUE)
> test2P()
[1] TRUE

但是,这会因您想要的示例函数而失败ll,这使我相信正在发生其他事情:

> llP <- Curry(ll, private=TRUE)
> ll()
  member data.class dimension objectSize
1    llP   function      NULL       1008
> llP()
Error in get("...", envir = envir) : 
  argument "..." is missing, with no default
于 2013-03-06T20:08:21.163 回答