Предупреждение "условие имеет длину> 1 и будет использоваться только первый элемент" - PullRequest
1 голос
/ 06 декабря 2010

Мой код R:

bnc1<-function(maxITR=100000, d=2, l=1){
    counts=0;
    for (i in 1:maxITR){
        x=runif(1,0,pi);
        y=runif(2,0,d/2);
        if ((l/2*sin(x)) >= y) counts=counts+1;
    } 
    counts/maxITR*d/l
}

Запуск кода:

> bnc1(maxITR=1000)
[1] 0.652
There were 50 or more warnings (use warnings() to see the first 50)
> warnings()
Warning messages:
1: In if ((l/2 * sin(x)) >= y) counts = counts + 1 ... :
  the condition has length > 1 and only the first element will be used
2: In if ((l/2 * sin(x)) >= y) counts = counts + 1 ... :
  the condition has length > 1 and only the first element will be used
...
49: In if ((l/2 * sin(x)) >= y) counts = counts + 1 ... :
  the condition has length > 1 and only the first element will be used
50: In if ((l/2 * sin(x)) >= y) counts = counts + 1 ... :
  the condition has length > 1 and only the first element will be used

У кого-нибудь есть идеи, что вызывает предупреждения?

1 Ответ

6 голосов
/ 06 декабря 2010

runif возвращает вектор.

if принимает одно значение (не вектор).

Проверьте руководство для runif, я не думаю, что вы используете его правильно.


В R часто имеет смысл удалить циклы и использовать вместо них векторы - например:

bnc1<-function(maxITR=100000, d=2, l=1){
    x=runif(maxITR,0,pi);
    y=runif(maxITR,0,d/2);
    counts = sum((l/2*sin(x)) >= y);
    counts/maxITR*d/l
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...