将函数作为R中另一个函数的参数传递

时间:2015-03-26 02:37:09

标签: r statistics

我试图编写一个函数来证明R中的中心极限定理。它将取值n和概率密度函数作为参数,并返回PDF的1000个样本的平均值n次。

所以我有一个PDF作为函数,像这样:

pdf1 <- function() {
  x = runif(1, min=0, max=2)
  if(x <= 1) {
    y = x
  } else {
    y=2-x
  }
  y
}

我试图在我的新函数中使用此函数作为参数,该参数应该从此PDF中返回1000个样本的均值。

newpdf <- function(n, pdfx) {
  array4 <- c()
  for(i in 1:n) {
    array4 = c(array4, mean(replicate(1000, pdfx)))
  }
  print(array4)
}

这不起作用。它只返回1次n值,如下所示:

newpdf(10, pdf1())
[1] 0.07446415 0.07446415 0.07446415 0.07446415 0.07446415 0.07446415 0.07446415 0.07446415 0.07446415
[10] 0.07446415

但如果我在PDF中硬编码,就像这样:

newpdf <- function(n){
     array4 <- c()
     for(i in 1:n) {
         array4 = c(array4, mean(replicate(1000, pdf1())))
     }
     print(array4)
 }

它给了我我想要的值......

> newpdf(19)

[1] 0.4924323 0.5007244 0.4935517 0.5070427 0.4882152 0.5006345 0.5080305 0.4992261 0.5106020
[10] 0.5045957 0.5080413 0.5049816 0.5043062 0.4964958 0.4903163 0.5203326 0.5107542 0.5069920
[19] 0.4921472

所以我不确定这里发生了什么。我不知道为什么它不能将PDF理解为参数,但是当我对其进行硬编码时它理解它。 无论如何,如果有人可以帮助阐明这一点,那就太棒了!

1 个答案:

答案 0 :(得分:1)

pdf1调用newpdf后不应使用括号,因为你传递的是函数名,而不是调用它。

遵循相同的逻辑,您应该在replicate()内使用它们。

pdf1 <- function() {
  x = runif(1, min=0, max=2)
  if(x <= 1) {
    y = x
  } else {
    y=2-x
  }
  y
}

newpdf <- function(n, pdfx) {
  array4 <- c()
  for(i in 1:n) {
    array4 = c(array4, mean(replicate(1000, pdfx())))
  }
  print(array4)
}

set.seed(1)
newpdf(19, pdf1)
[1] 0.5027618 0.4827648 0.4943929 0.4750925 0.4948409 0.5177700 0.4982195 0.5003837 0.5011541 0.4884556
[11] 0.5022072 0.4999359 0.4882833 0.4959163 0.5146288 0.4954670 0.5057518 0.5008227 0.5000727