关于outer()的用法和输出

时间:2014-01-14 09:25:35

标签: arrays r function

请运行以下可重现的代码:

require(compiler)

a <- 1:80
n <- 1:140

fn <- cmpfun(function(a, n)
{
  K <- ceiling(runif(n, min = 1, max = 80))
  p <- length(K[K >= min(80, a + 5)]) / n
  return(p)
})

确保fn()函数返回的数字小于1,因为它应该返回K中大于{{a + 5的随机数的频率。 1}};这可以通过fn()中的随机整数输入验证:

for(i in seq(8, 80, 8))
{
  for(j in seq(14, 140, 14))
  {
    print(fn(i,j))
  }
}

现在我想将fn()的交叉功能应用于an数组,我认为outer()是最佳解决方案:

  

数组XY的外部产品是数组A,其中维度为c(dim(X), dim(Y)),其中元素为A[c(arrayindex.x, arrayindex.y)] = FUN(X[arrayindex.x], Y[arrayindex.y], ...)

我希望从01输出

persp(x = a, y = n, z = outer(X = a, Y = n, FUN = fn), 
      ticktype = 'detailed', phi = 30, theta = 120)

会返回此输出,而不是:

enter image description here

使用outer()时我缺少什么?

2 个答案:

答案 0 :(得分:2)

length(K[K >= min(80, a + 5)])不是您认为的那样。 outer需要一个函数,该函数在两个参数中都是矢量化的。你的功能是偶然的矢量化,但不是你想要的。

看看这个:

set.seed(42)
n <- 1:5
x <- runif(n, min = 1, max = 80)
#[1] 73.26968 75.02896 23.60502 66.60536 51.69790
x/n
#[1] 73.269677 37.514479  7.868341 16.651341 10.339579

答案 1 :(得分:1)

正如@Roland所说,您需要输入outer的函数需要先进行矢量化。一种方法:

fn_vec <- Vectorize(fn)
outer(a,n,fn_vec)