2016-05-30 10 views
2

ににこれらの引数を渡すときに `...`ここで私は、ユーザーがxlabylabを指定していないので、はどのように、別の関数

myfun <- 
    function(...){ 

     # myfun only passes `...` on to the plot function 
     plot( 
      ... , 
      if(!'xlab' %in% names(list(...))) xlab = 'mylabel' , 
      if(!'ylab' %in% names(list(...))) ylab = 'ylabel' 
     ) 
    } 

# works the way i want: user specified `xlab` and `ylab` so `...` used them 
myfun(1 , 1 , xlab = "new label" , ylab = "another label") 

# fails 
myfun(1 , 1) 
# Error in plot.window(...) : invalid 'xlim' value 

が起こるしたいものの最小限の再現性の例です。デフォルトの要素を追加します私は自分の関数が設定したデフォルトを使うことを望んでいました。そう

plot(1 , 1 , xlab = 'mylabel' , ylab = 'ylabel') 

私はxlabylabのような多くの可能性を持っている場合は、これを行うための賢い方法は何ですか?私はtitle=xlim=ylim=のデフォルトを追加することもできますので、すべての組み合わせを書くことは実現できませんか?ありがとう!!

答えて

2

ソリューション1

plot機能に独自のカスタムラッパーを作る:私はあなたがそれらが仕事をしたいと思うよう

myplot <- function(x, y, xlab = 'mylabel', ylab = 'ylabel', ...){ 
    plot(x, y, xlab = xlab, ylab = ylab, ...) 
} 


myfun <- 
    function(...){ 

    # myfun only passes `...` on to the plot function 
    myplot(...) 

    } 

ここで、次の呼び出しは動作します:

myfun(1, 1) 
myfun(1, 1,xlab = "new label" , ylab = "another label") 

溶液2

また、次のようにしlist(...)do.callを使用することができます。

myfun <- 
    function(...){ 

    dots = list(...) 

    # check whether needed defaults are supplied, if not, supply them. 
    if ~grep('xlab', names(dots)){ 
     dots$xlab = 'mylabel' 
    }   
    if ~grep('ylab', names(dots)){ 
     dots$ylab = 'ylabel' 
    } 


    # myfun only passes `...` on to the plot function 
    do.call(plot, dots) 

    } 
+0

私はあなたfor..thank探していたまさに! https://github.com/DjalmaPessoa/convey/commit/4dd0d2d2f36385423e9c03fc6cb2ed51e060fcf9 –

+0

引用、ありがとう! – Alex

関連する問題