以下是我遇到的一個問題的示例。我是否濫用或者這是一個錯誤?正確的大括號放置在:= 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)]
以下是我遇到的一個問題的示例。我是否濫用或者這是一個錯誤?正確的大括號放置在:= 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)]
不是一個錯誤, 它只是大括號的順序應該是不同的:
也就是說,使用大括號包裹只在`:=`(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突出顯示!
你能解釋爲什麼原始版本不起作用嗎?你提供的答案已經在之前的評論中提供了 – Alex
@Alex,肯定:目前,唯一可以在':='運算符的左邊是LHS的參數。 'b = a + 3'不是LHS的一部分,而是RHS。當您將支架放在LHS周圍時,您基本上會將混音信號發送給解析器。也就是說,當它遇到':='時,它將其讀爲「第二」賦值操作,這是不允許的。 (例如,如果你分配了兩個參數,你可以使用'x [,c(「d」,「e」):= list(a + 3,b * 7)]')。 HTH –
+1正確。 ':='必須以特定的方式使用。這與它在C內部實現的方式有關。但是可以對錯誤消息進行改進。將添加編輯。 –
我很難說出它是如何工作的,但我認爲你所追求的是:'x [,「:=」(c = {b <-a + 3; b})]]'。 (我的雙引號應該讀反引號) – flodel
還要注意data.table甚至不喜歡'x [,{':='(c = b)}]'或'x [,{c:= b}] '。就我個人而言,我不會認爲這是一個錯誤,而只是簡單的調整,以它明顯想要的方式來說'data.table';)。在這種情況下,這意味着任何':='語句都應該是'j'中的唯一語句。 –
也許我們可以改變問題的標題,因爲我們同意這不是一個錯誤 –