2

私の使用法がデフォルトと一貫して異なるような R 関数がある場合、コードを簡潔にして維持しやすくするために、スクリプトの冒頭で次のようなことを行うのが好きです (この例ではll()R.ooパッケージ):

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

これはうまくいきます。ただし、関数が...引数から読み取る既定のオプションを作成したいと考えています (この例では、引数is.function=Fを既定値に追加し...、2 番目の正式な引数です)。誰もそれを行う方法を知っていますか? 私は次のことを試しました...

> 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つの引数のためにラッパーを書く以外に、これを達成する方法を知っている人はいますか?

4

1 に答える 1

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
于 2013-03-06T20:08:21.163 に答える