2017-07-28 65 views
0

我正在使用R版本3.3.2(2016-10-31)的data.table(可能是過時的)1.10.4版本。我可以通過美元符號訪問不存在的列。這是行爲嗎?使用美元符號訪問data.table中不存在的列

代碼:

realOffloads = data.table(BAG_TAG = c(1,2,3)) 
realOffloads = realOffloads[, .(BAG_TAG, OFFLOAD_REAL = T)] 
"OFFLOAD" %in% names(realOffloads) 
x = realOffloads$OFFLOAD 

雖然我得到「假」的回答爲列「卸載」是否存在,我得到的東西出來的(T,T,T)時的問題使用美元符號訪問它。

我用那個漂亮經常在代碼所以現在我有點害怕:-()

問候, FW

+1

這是從基地R,例如'list(a = 2)$ b'。如果你想data.table引發一個錯誤,你可以像'data.table(a = 1)[,b]'那樣提取列。或者寫下'if(「b」%in%names(DT))x = DT $ b else stop(「zomg」)'。 – Frank

回答

0

從基礎R文檔:

兩個[[$選擇列表中的單個元素。主要差異 是$不允許計算指數,而[[x$name是 相當於x[["name", exact = FALSE]]。此外,可以使用確切的參數來控制[[的部分匹配 行爲。

data.tabledata.framedata.framelist,因此data.tablelist。因此允許與$不精確匹配。這對於您嘗試快速瀏覽數據的交互式會話來說很不錯,但對於非交互式代碼來說,如果發生意想不到的事情時會爆炸,那麼這種交互式會話就不那麼好了。

這就是爲什麼它幾乎總是如果您不是100%確定該列存在,那麼使用$作爲子集的一個好主意。即便如此,它可能會成爲錯別字。而不是DT$name,請使用DT[["name"]]。這不會引發錯誤,但會返回NULL,這很容易檢查。即使你放棄了,NULL也可能會導致錯誤。

+0

我喜歡使用美元符號的原因是它有一些自動完成,即當我有一個名爲LONG_AND_COMPLICATED_COLUMN_NAME的列時,我總是在用dt [[「...」]]訪問它時必須複製/粘貼。 。對於美元符號,我只需鍵入dt $ LO,然後RStudio就會自動爲我完成它... –

+0

您是對的:美元符號的意思是非常適合交互使用。但它在非交互式代碼中成爲風險。我會編輯我的回覆以作出區分。 –