考虑以下示例:
q1.func <- function(x) {
num <- (cos(30.2 * x^(1/2)))^2
denom <- (x^0.7) * exp(0.9*x)
num / denom
}
method1 <- function(n) {
x <- runif(n,min = 0, max = 1.7)
f <- q1.func(x)
(1.7) * sum((1/n) * f)
}
draw.graph <- function() {
n <- seq(1,1000,1)
x <- c()
for(i in 1:length(n)) {
x <- append(x, method1(n[i]))
}
plot(n, x, type = "p", xlab = "N",ylab = "value" ,main = "method1 plot",col = "black")
}
我的观点是我希望能够执行: draw.graph(method1(n)) 。但R不允许我这样做。我不明白为什么会这样?我的最终目标是我能够传递method2 / method3 / ....作为draw.graph()函数的参数。但是如何???现在,我只对允许我将method1作为draw.graph函数的参数传递的解决方案感兴趣。请不要让我在draw.graph函数中编写method1,因为我已经知道它有效。但我更感兴趣的是将method1作为draw.graph函数的参数传递。感谢
答案 0 :(得分:5)
我将举一个更简单的例子来说明要点(你提出的代码存在其他问题)。
fun1 = function(x) cos(x)
fun2 = function(x) sin(x)
# function where one argument is a function
wrapper = function(a = 2, fun = fun1){
x = 1:10
return(data.frame(x = x, y = a*fun(x)))
}
# testing behaviour
wrapper()
wrapper(fun = fun2)
答案 1 :(得分:5)
您的draw.graph
函数缺少参数。
为什么不简单地使用函数的返回值作为下一个函数的参数?
draw.graph <- function(y) {
plot(seq_along(y), y)
}
method1 <- function(n) {
return(runif(n, min=0, max=1.7))
}
draw.graph(method1(100))
如果你真的需要一个函数作为参数,你可以尝试以下(请阅读?match.fun
):
## stupid example
calc <- function(x, fun) {
fun <- match.fun(fun)
return(fun(x))
}
calc(1:10, sum)
编辑: 为了满足OP问题/评论,我添加了这个具体的例子:
q1.func <- function(x) {
num <- cos(30.2 * sqrt(x))^2
denom <- x^0.7 * exp(0.9*x)
return(num/denom)
}
method1 <- function(n) {
x <- runif(n, min=0, max=1.7)
return(1.7*sum(1/n*q1.func(x)))
}
draw.graph <- function(n, fun) {
fun <- match.fun(fun)
y <- unlist(lapply(n, fun))
plot(n, y)
}
draw.graph(1:1000, method1)