2013-03-31 83 views
9

以下是我遇到的一個問題的示例。我是否濫用或者這是一個錯誤?正確的大括號放置在:= data.table

require(data.table) 
x <- data.table(a = 1:4) 

# this does not work 
x[ , {b = a + 3; `:=`(c = b)}] 
# Error in `:=`(c = b) : unused argument(s) (c = b) 

# this works fine 
x[ ,`:=`(c = a + 3)] 
+4

我很難說出它是如何工作的,但我認爲你所追求的是:'x [,「:=」(c = {b <-a + 3; b})]]'。 (我的雙引號應該讀反引號) – flodel

+3

還要注意data.table甚至不喜歡'x [,{':='(c = b)}]'或'x [,{c:= b}] '。就我個人而言,我不會認爲這是一個錯誤,而只是簡單的調整,以它明顯想要的方式來說'data.table';)。在這種情況下,這意味着任何':='語句都應該是'j'中的唯一語句。 –

+1

也許我們可以改變問題的標題,因爲我們同意這不是一個錯誤 –

回答

13

不是一個錯誤, 它只是大括號的順序應該是不同的:

也就是說,使用大括號包裹只在`:=`(LHS, RHS)

例的RHS說法:

# sample data 
x <- data.table(a = 1:4) 

# instead of: 
x[ , {b = a + 3; `:=`(c, b)}] # <~~ Notice braces are wrapping LHS AND RHS 

# use this: 
x[ , `:=`(c, {b = a + 3; b})] # <~~ Braces wrapping only RHS 

x 
# a c 
# 1: 1 4 
# 2: 2 5 
# 3: 3 6 
# 4: 4 7 

但是,更多簡潔而自然:

你可能在尋找這樣的:

x[ , c := {b = a + 3; b}] 


更新馬太福音

沒錯。在其他不正確的方式使用:=給出了這樣的(長)錯誤:

x := 1 
# Error: := is defined for use in j only, and (currently) only once; i.e., 
# DT[i,col:=1L] and DT[,newcol:=sum(colB),by=colA] are ok, but not 
# DT[i,col]:=1L, not DT[i]$col:=1L and not DT[,{newcol1:=1L;newcol2:=2L}]. 
# Please see help(":="). Check is.data.table(DT) is TRUE. 

但不是在的情況下,這一問題表現,給予剛:

x[ , {b = a + 3; `:=`(c = b)}] 
# Error in `:=`(c = b) : unused argument(s) (c = b) 

我只是改變了這v1.8.9 。無論使用:=的這些不正確的方式現在給出一個更簡潔的錯誤:

x[ , {b = a + 3; `:=`(c = b)}] 
# Error in `:=`(c = b) : 
# := and `:=`(...) are defined for use in j only, in particular ways. See 
# help(":="). Check is.data.table(DT) is TRUE. 

,我們將美化?":="。感謝@Alex突出顯示!

+0

你能解釋爲什麼原始版本不起作用嗎?你提供的答案已經在之前的評論中提供了 – Alex

+3

@Alex,肯定:目前,唯一可以在':='運算符的左邊是LHS的參數。 'b = a + 3'不是LHS的一部分,而是RHS。當您將支架放在LHS周圍時,您基本上會將混音信號發送給解析器。也就是說,當它遇到':='時,它將其讀爲「第二」賦值操作,這是不允許的。 (例如,如果你分配了兩個參數,你可以使用'x [,c(「d」,「e」):= list(a + 3,b * 7)]')。 HTH –

+3

+1正確。 ':='必須以特定的方式使用。這與它在C內部實現的方式有關。但是可以對錯誤消息進行改進。將添加編輯。 –