2017-04-05 17 views
2

我期望ifelse函數返回相同類型作爲其第二個或第三個參數的一個空的載體,具體根據文檔:R ifelse是否正確地使用空向量?

值:

相同長度的向量和屬性(包括尺寸和 ''class'')作爲'測試'並且來自'是'或 '否'的值的數據值。答案的模式將從邏輯上強制爲 ,首先適用從'是'取得的任何值,然後從'否'取得任何取值 。

但是,在所有矢量都爲空的情況下,無論第二個和第三個參數的類型如何(R版本3.3.2),它都返回logical(0)

> ifelse(logical(), numeric(), numeric()) 
logical(0) 

這是一個錯誤?如果是的話,我該如何報告,是否有機會修復?

我用例是我自己用任意值

rep_nan<-function(x, value=0) ifelse(is.na(x), value, x) 

但是提到不一致導致的問題類型的NA替換,例如,用data.table工作時的功能。

回答

3

在你的例子中,ifelse()返回logical(0)不是因爲空數字被強制,而是因爲每當test = logical(0),結果是logical(0)

ifelse(logical(), numeric(), numeric()) 
# logical(0) 

ifelse(0, numeric(), numeric()) 
# NA 

ifelse(logical(), 0, 1) 
# logical(0) 

返回缺失值,即使從邏輯脅迫發生的文檔描述:

class(ifelse(0, numeric(), numeric())) 
# "numeric" 
+0

我看到的行爲,我現在承認這可以解釋爲不矛盾的文檔。但我仍然看不到這種行爲的原因。 – Valentas

+0

@Valentas R會返回一個無效的邏輯測試嗎?返回'yes'或'no'參數值是沒有意義的,因爲'test'既不是假也不是真。這種行爲也反映了「is.na(邏輯())」,並且比返回「NA」更具信息性(即它報告輸入的長度爲0) – coletl

+0

它應該停止,異常情況下無效的邏輯測試。我可以舉一個例子,其中相應的函數的行爲正確和一致:http://code.kx.com/q/ref/lists/#vector-conditional – Valentas