2014-01-14 2 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)) 
    } 
} 

Теперь я хотел бы получить перекрестную функцию 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) 

делает возвращение этот вывод, а:

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) 
Смежные вопросы