2015-01-16 9 views
10

Mi chiedo il motivo per cui per il dato data.table:sottosezioni data.table utilizzando una colonna logica: perché devo confrontare esplicitamente con TRUE?

library(data.table) 
DT <- structure(list(number = 1:5, bmask = c(FALSE, TRUE, FALSE, TRUE, 
FALSE)), .Names = c("number", "bmask"), row.names = c(NA, -5L 
), class = c("data.table", "data.frame")) 

> DT 
    number bmask 
1:  1 FALSE 
2:  2 TRUE 
3:  3 FALSE 
4:  4 TRUE 
5:  5 FALSE 

l'espressione DT[bmask==T,.(out=number)] funziona come previsto:

out 
1: 2 
2: 4 

ma DT[bmask,.(out=number)] causa l'errore:

> DT[bmask,.(out=number)] 
Error in eval(expr, envir, enclos) : object 'bmask' not found 

Si tratta di un comportamento corretto del pacchetto data.table?

risposta

13

Usare questo invece:

DT[(bmask), .(out=number)] 
# out 
# 1: 2 
# 2: 4 

Il ruolo delle parentesi è mettere il simbolo bmask all'interno di una chiamata di funzione, dalla cui indagini ambientali colonne del DT saranno visibili . Qualsiasi altra chiamata di funzione che restituisce semplicemente il valore di bmask (ad esempio c(bmask), I(bmask) o bmask==TRUE) o gli indici dei suoi elementi reali (ad esempio which(bmask)) funzioneranno altrettanto bene, ma potrebbe richiedere un tempo leggermente più lungo per il calcolo.

Se bmask è non situato all'interno di una chiamata di funzione, verrà cercata nel chiamare ambito (qui l'ambiente globale), che può anche essere utile, a volte. Ecco la spiegazione rilevante dal ?data.table:

Advanced: When 'i' is a single variable name, it is not considered an expression of column names and is instead evaluated in calling scope.


di vedere che () sé è una chiamata di funzione, tipo is(`(`).

Problemi correlati