當我使用.Internal(inspect())to NA_real_and 時NaN,它回傳,
> .Internal(inspect(NA_real_))
@0x000001e79724d0e0 14 REALSXP g0c1 [REF(2)] (len=1, tl=0) nan
> .Internal(inspect(NaN))
@0x000001e797264a88 14 REALSXP g0c1 [REF(2)] (len=1, tl=0) nan
似乎他們唯一的區別是記憶體地址。
但是,當我將NA_real_and強制NaN轉換為字符時,它會回傳,
> as.character(c(NaN, NA_real_))
[1] "NaN" NA
據我所知,它應該回傳上面的結果NaN不可能是性格和它將被強迫"NaN",但NA_real會被強迫NA_character_。但是考慮到他們的直覺是一樣的,R 怎么會為他們回傳不同的結果呢?
預先感謝您的任何建議!
uj5u.com熱心網友回復:
好。首先,請記住,這NA是一個在 C 中沒有等價物的 R 概念。因此,根據需要,NA需要在 C 中以不同的方式表示。.Internal(inspect())沒有進行這種區分的事實并不意味著它沒有在其他地方進行過。事實上,恰巧.Internal(inspect())用途Rprintf列印值的內部雙浮點表示。事實上,R NA 被編碼為 C 浮點型別的 NaN 值。
其次,您觀察到“它們唯一的區別是記憶體地址。” - 所以呢?至少在概念上,不同的記憶體地址完全足以區分 NA 和 NaN,僅此而已。
但事實上,R 通過不同的途徑區分這些值。這是可能的,因為IEEE 754 雙精度浮點格式有多種不同的 NaN 表示,而 R 為 NA 保留了一個特定的表示:
static double R_ValueOfNA(void)
{
/* The gcc shipping with Fedora 9 gets this wrong without
* the volatile declaration. Thanks to Marc Schwartz. */
volatile ieee_double x;
x.word[hw] = 0x7ff00000;
x.word[lw] = 1954;
return x.value;
}
和:
/* is a value known to be a NaN also an R NA? */
int attribute_hidden R_NaN_is_R_NA(double x)
{
ieee_double y;
y.value = x;
return (y.word[lw] == 1954);
}
int R_IsNA(double x)
{
return isnan(x) && R_NaN_is_R_NA(x);
}
int R_IsNaN(double x)
{
return isnan(x) && ! R_NaN_is_R_NA(x);
}
( src/main/arithmetic.c)
uj5u.com熱心網友回復:
NA是一個統計或資料完整性概念:“缺失值”的概念。例如,如果您的資料來自填寫表格的人,則錯誤的條目或缺失的條目將被視為NA.
NaN是一個數值或計算概念:“不是數字”的東西。例如 0/0 是NAN,因為這個計算的結果是未定義的(但請注意 1/0 是Inf,或無窮大,類似地 -1/0 是-Inf)。
R 在內部處理這些概念的方式不是您應該關心的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393460.html
上一篇:選擇表中倒數第二小的日期
下一篇:xts格式為索引列指定名稱
