2016-10-17 3 views
0

У меня есть пользовательская функция:вызова пользовательской функции с индексированным векторным аргументом

f <- function(N, zero_per, sed) { 
    set.seed(sed) 
    M <- N-(N*zero_per) 
    y_g <- rgamma(M, shape=rnorm(M,1,2), rate=rnorm(M,1,2)) 
    df_g <- data.frame(y=y_g) 
    df_l <- data.frame(y=rep(0, N-M)) 
    df <- rbind(df_g, df_l) 
    return(df) 
} 

эта функция является частью цикла, где я использую последовательность для второго аргумента:

> sq <- seq(0.05, 0.7, 0.05) 
> sq 
[1] 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 

12-й позиции имеет значение 0,6:

> sq[12] 
[1] 0.6 

Однако, когда я вызываю функцию, один раз с числовым аргументом 0. 6, и один раз с sq [12], я получаю разные результаты:

> head(f(5000, sq[12], 1)) 
      y 
1  NaN 
2  NaN 
3  NaN 
4 0.7547084 
5 1.0643216 
6  NaN 
Warning message: 
In rgamma(M, shape = rnorm(M, 1, 2), rate = rnorm(M, 1, 2)) : NAs produced 

> head(f(5000, 0.6, 1)) 
      y 
1  NaN 
2  NaN 
3  NaN 
4 0.8990203 
5 1.0719659 
6  NaN 
Warning message: 
In rgamma(M, shape = rnorm(M, 1, 2), rate = rnorm(M, 1, 2)) : NAs produced 

Я использую одно и то же семя.

Как ни странно, это не происходит, когда я использую 0.5:

> head(f(5000, sq[10], 1)) 
      y 
1  NaN 
2  NaN 
3  NaN 
4 0.4426849 
5  NaN 
6  NaN 
Warning message: 
In rgamma(M, shape = rnorm(M, 1, 2), rate = rnorm(M, 1, 2)) : NAs produced 
> head(f(5000, 0.5, 1)) 
      y 
1  NaN 
2  NaN 
3  NaN 
4 0.4426849 
5  NaN 
6  NaN 
Warning message: 
In rgamma(M, shape = rnorm(M, 1, 2), rate = rnorm(M, 1, 2)) : NAs produced 

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

Что здесь происходит?

+2

Try 'кв [12] - 0.6' и видеть, что он не равен нулю. Классический пример [R FAQ 7.31] (https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f), * " Почему R не считает эти цифры равными? »*. – r2evans

ответ

1

Проблема заключается в том, что:

sq[12]==0.6 
#[1] FALSE 

Хотя

sq[10]==0.5 
#[1] TRUE 

Чтобы увидеть, что, сделайте следующее:

options(digits = 20) 

sq[12] 
#[1] 0.60000000000000009 

sq[10] 
#[1] 0.5 
+1

спасибо, я никогда не слышал об этой проблеме – spore234

Смежные вопросы