2014-01-14 46 views
0

請運行下面的重複性代碼:關於使用和輸出外()

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;這可以通過隨機整數投入在fn()進行驗證:

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

現在我想獲得適用於an陣列fn()交叉功能,我想outer()是最好的解決辦法:

陣列XY的外積是數組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) 

不會返回此輸出,而不是:

enter image description here

我在使用outer()很想念?

回答

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 
+0

但是'n'應該是我的函數中的單個數字嗎?這不是一個數組,是嗎?那麼它應該使'K'(在你的例子中是''x')的比率爲單個數字,而不是數組... –

+2

你假設n是一個長度的向量。您使用的基本功能不會假設這一點。 – Roland

1

正如@Roland說,你需要輸入outer功能首先需要量化。這樣做的一種方法:

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