当使用formals()更改其他人编写的R函数的默认参数时,如何处理省略号(...)

时间:2013-03-06 17:01:18

标签: r function arguments

当有一个R函数使我的使用始终与默认值不同时,为了保持我的代码简洁和易于维护,我喜欢在我的脚本开头做类似的事情(在这个例子中我是&#39 ; m使用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包,但文档说:

  

目前,无法传递值。 。 。论证,只   在原始函数定义中正式指定的参数

有没有人知道如何实现这一点,而不是因为只有一个参数而写一个包装器?

1 个答案:

答案 0 :(得分:2)

您可以在Curry库中使用functional

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