2013-08-19 45 views
6

Tôi có hàm bao bọc, trong đó tôi cần chuyển đối số tùy chọn cho hàm phụ được chỉ định. Nhưng có rất nhiều chức năng phụ có thể khác nhau mà tôi không thể chỉ định trước chúng. Để tham khảo, tiểu chức năng tồn tại trong môi trường vv ... xem xét:Truyền tham số tùy chọn bên trong hàm bao hàm cho hàm phụ

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. 

Trả lời

5

Bạn cần phải vượt qua ... để method.out. Sau đó, nó hoạt động tốt:

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

Tốt. Cảm ơn Thomas. –

0

Ngoài Thomas' answer cho câu hỏi của OP bạn có thể phải chuyển tiếp một đối số tùy chọn đó là một cuộc tranh cãi rõ ràng của hàm wrapper.

Trong trường hợp này, thay vì lặp lại giá trị mặc định của hàm được bao bọc trong định nghĩa trình bao bọc, bạn có thể sử dụng missing để tạo cuộc gọi với đối số bị thiếu.

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

Trong khi điều này không trả lời câu hỏi được nêu trong phần câu hỏi OP, nó cung cấp câu trả lời tôi đang tìm kiếm khi đọc tiêu đề câu hỏi trên google. –

Các vấn đề liên quan