请运行以下可重现的代码:
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()
的交叉功能应用于a
和n
数组,我认为outer()
是最佳解决方案:
数组
X
和Y
的外部产品是数组A
,其中维度为c(dim(X), dim(Y))
,其中元素为A[c(arrayindex.x, arrayindex.y)] = FUN(X[arrayindex.x], Y[arrayindex.y], ...)
。
我希望从0
到1
输出
persp(x = a, y = n, z = outer(X = a, Y = n, FUN = fn),
ticktype = 'detailed', phi = 30, theta = 120)
会返回此输出,而不是:
使用outer()
时我缺少什么?
答案 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)