4

考虑以下示例:

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 函数的参数。谢谢

4

2 回答 2

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)
于 2012-11-21T08:07:57.080 回答
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)

在此处输入图像描述

于 2012-11-21T08:08:45.220 回答