2016-05-30 10 views
2

hier ist ein minimal reproduzierbares Beispiel geben, was ich willwie Standardelemente `...` hinzuzufügen, wenn diese Argumente auf einer andere Funktion

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 

passieren, da der Benutzer nicht xlab und ylab angegeben hat, Ich wollte, dass meine Funktion die von mir eingestellten Standardeinstellungen verwendet. so

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

was ist der cleverste Weg, dies zu tun, wenn ich viele Möglichkeiten wie xlab und ylab haben? Ich möchte auch Standardeinstellungen für title= und xlim= und ylim= hinzufügen, so dass jede Kombination nicht machbar ist? Vielen Dank!!

Antwort

2

Lösung 1

Machen Sie Ihre eigene Wrapper zum plot Funktion:

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(...) 

    } 

nun folgende Anrufe arbeiten, wie ich glaube, Sie sie arbeiten wollen:

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

Lösung 2

Sie können auch list(...) und do.call auf folgende Weise verwenden:

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

genau das, was ich for..thank Sie war auf der Suche! https://github.com/DjalmaPessoa/convey/commit/4dd0d2d2f36385423e9c03fc6cb2ed51e060fcf9 –

+0

hey, danke für das Zitat! – Alex