2013-08-19 24 views
6

Mam funkcję opakowania, w której muszę przekazać opcjonalne argumenty do podfunkcji określonej. Ale jest tak wiele różnych możliwych podfunkcji, że nie mogę ich wstępnie określić. odsyłającym podrzędne funkcje istnieć w środowisku itd ... Rozważmy:Przekazywanie opcjonalnych argumentów wewnątrz funkcji opakowania do podfunkcji

funInFun<- function (x, method, ...) {  

    method.out <- function(this.x, FUN, ...) { 
    FUN <- match.fun(FUN) 
    c <- FUN(this.x, ...) 
    return(c) 
    } 

    d <- method.out(x, method) 
    return(d) 
} 

data<-seq(1,10) 
funInFun(data, mean) # Works 

data<-c(NA,seq(1,10)) 
funInFun(data, mean, na.rm=TRUE) # Should remove the NA 

funInFun(c(seq(1,10)), quantile, probs=c(.3, .6)) # Shoudl respect the probs option. 

Odpowiedz

5

Trzeba przekazać ... do method.out. Wtedy to działa dobrze:

funInFun<- function (x, method, ...) {  

    method.out <- function(this.x, FUN, ...) { 
    FUN <- match.fun(FUN) 
    c <- FUN(this.x, ...) 
    return(c) 
    } 

    d <- method.out(x, method, ...) # <<--- PASS `...` HERE 
    return(d) 
} 

data<-seq(1,10) 
funInFun(data, mean) # Works 
# [1] 5.5  

data<-c(NA,seq(1,10)) 
funInFun(data, mean, na.rm=TRUE) # Should remove the NA 
# [1] 5.5 

funInFun(c(seq(1,10)), quantile, probs=c(.3, .6)) 
# 30% 60% 
# 3.7 6.4 
+0

Nice. Dzięki, Thomas. –

0

Oprócz Thomas' answer na pytanie OP może masz do przekazania opcjonalny argument, który jest wyraźny argument funkcji otoki.

W tym przypadku zamiast powtarzania wartości domyślnej funkcji zawijanej w definicji opakowania, można użyć missing, aby skonstruować połączenie z brakującym argumentem.

f <- function(s = "world!") cat("Hello", s) 
f() 
# Hello world! 
g <- function(s = NULL) eval(substitute(
    f(s = sub_me), 
    list(sub_me = if(missing(s)) quote(expr =) else s))) 
g() 
# Hello world! 
g("you!") 
# Hello you! 
+0

Podczas gdy to nie odpowiada na pytanie zadane w organach pytań do OP, zapewnia odpowiedź, której szukałem, czytając tytuł pytania w google. –

Powiązane problemy