2016-04-16 4 views
3

私は変数名にdata.tableの列名を格納しています。これらの変数を介して列を参照する必要があります。私はコードを動作させましたが(下の例)、私は時々get()といつかeval()を使う必要があるという手掛かりはありません。誰かがこれを明確にすることはできますか?R - 列名をdata.tableに渡す式 - getとevalの差

# generate some data 
foo <- rep(1:2,each = 3) 
bar <- rep(c("A","B","C"),2) 
baz <- rep(1:5,2)[1:6] 
df <- data.frame(foo,bar,baz) 
setDT(df) 

# refer to columns directly by their names 
df[, "qux":=baz-baz[bar=="C"], by=foo] 

# save column names into variables and call columns via these variables 
var1 <- "foo" 
var2 <- "bar" 
var3 <- "baz" 
varNew <- "qux2" 

df[, eval(varNew) := get(var3) - get(var3)[get(var2) == "C"], by = get(var1)] 

df 
    foo bar baz qux qux2 
1: 1 A 1 -2 -2 
2: 1 B 2 -1 -1 
3: 1 C 3 0 0 
4: 2 A 4 3 3 
5: 2 B 5 4 4 
6: 2 C 1 0 0 
+4

'eval(varNew)'は単一の文字列 'qux2'を返し、' get(var1) 'は' var1'のすべての値を返します。この場合、 'var1'は' foo 'なので 'get(var1)'は '' foo''にあるものの値を返します。言い換えれば、あなたの例では、 'eval'は単一の文字列を返し、' get'は各列の値を返します。 – steveb

+2

'by = get(。)'を 'by'引数として使用する必要はありません。 – jangorecki

+0

の文字ベクトルを受け入れます。多くの場合、bquoteを使って式全体を構築し、それを評価することでこの問題を回避できます –

答えて

4

この例ではevalgetは機能が異なる方法の違いを示しています。 data.tableオブジェクトを使用すると、それぞれが何をするかを示す必要はありません。

iVec  <- c(123, 456) 
iVarName <- "iVec" 

# Returns the contents of 'iVarName' (a string). This happens 
# to be the name of a variable but doesn't have to. 
eval(iVarName) 
##> [1] "iVec" 

# Returns the contents of what 'iVarName' refers to (it 
# refers to the variable "iVec" in this case, which 
# is a variable which contains a vector of integers). 
get(iVarName) 
##> [1] 123 456 

### ######################################### 
### Similar to above but where the variable 
### 'iVec2' does not exist. 
### ######################################### 
rm(iVec2) 
# The variable "iVec2" does not exist. 
iVarName2 <- 'iVec2' 

# Returns the contents of 'iVarName2' (a string). This is not 
# the name of an existing variable in this context. 
eval(iVarName2) 
## [1] "iVec2" 
get(iVarName2) # Returns an error because 'iVec2' doesn't exist. 
## Error in get(iVarName2) : object 'iVec2' not found 

この質問はevalget詳細ですので、私はdata.table詳細を除外します。 data.tableが文字列と変数名を扱う方法は、異なるSOの投稿では非常に可能性が高いです。

関連する問題