用于在函数上循环以获得R中的函数输出

时间:2013-11-11 11:48:49

标签: r

我想计算与向量中每个值关联的函数的积分。举一个例子,我准确地描述了我的目标如下。

假设xy是独立的随机变量,I是一个指标变量,如果I=1y > 0.25x则为zero 。我希望从指数分布中得到n y的绘制,并且对于每个绘制,我希望计算g = xf(x)Ixf(x)的分布上的积分。我希望这个分布是指数的,参数值为1.我在r中尝试了以下代码。

f = function(n){
  h = list()
  g = numeric()
  y = rexp(n)
  for(i in 1:n){
    h[i] = function(x){(x * dexp(x) * (y[i] > 0.5*x))}
    g[i] = integrate(h[i], lower=-Inf, upper=Inf)
  }
  return(summary(g))
}

但是当我运行f(3)时,我收到一条错误消息“*Error in h[i] = function(x) { : cannot coerce type 'closure' to vector of type 'list'"*。但是当我运行以下代码时

y = rexp(1)
h = function(x){x * dexp(x) * (y > 0.5*x)}
integrate(h, lower=-Inf, upper=Inf)
f(3)

我得到了结果。是否有人建议如何改进此代码,以便在h的每个值处评估y函数,输出为function,然后将其传递给{{1}功能?

2 个答案:

答案 0 :(得分:1)

我建议使用sapply代替循环:

f = function(n){
  y = rexp(n)
  g = sapply(1:n, function(i) 
                  integrate(function(x) (x * dexp(x) * (y[i] > 0.5*x)), lower=-Inf, upper=Inf))
  return(summary(g))
}

答案 1 :(得分:1)

您需要将[[用于子集h,而不是[。这是因为[将返回子列表而不是内容。此外,integrate会返回一个复杂的结构,如果您只想要该值,请附加$value来选择该值。

f = function(n){
  h = list()
  g = numeric()
  y = rexp(n)
  for(i in 1:n){
    h[[i]] = function(x){(x * dexp(x) * (y[i] > 0.5*x))}
    g[i] = integrate(h[[i]], lower=-Inf, upper=Inf)$value
  }
  return(summary(g))
}

f(3)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.2456  0.3269  0.4082  0.4069  0.4876  0.5669