2015-12-02 17 views
12

Ottengo risultati divertenti utilizzando mutate con un'estrazione $ quando si verifica una variabile nell'ambiente globale con lo stesso nome come l'elemento che viene estratto. (Sto correndo R 3.1.3 e dplyr 0.4.3.9.) Ciò funziona benissimo:mutate() sta tentando di estrarre utilizzando il valore di una variabile globale quando si utilizza l'operatore del segno di dollaro

library(dplyr) 

df <- data.frame(time = 1:5, val = c(2.3, 3.9, NA, 8.1, 9.6)) 

mutate(df, val = approx(time, val, time)$y) 
# time val 
# 1 1 2.3 
# 2 2 3.9 
# 3 3 6.0 
# 4 4 8.1 
# 5 5 9.6 

Ma se io definisco una variabile globale y, cose divertenti accadere:

y <- 1L 
mutate(df, val = approx(time, val, time)$y) 
# Error: invalid subscript type 'integer' 

noti che usare doppie parentesi con un argomento stringa ancora funziona come previsto:

mutate(df, val = approx(time, val, time)[['y']]) 
# time val 
# 1 1 2.3 
# 2 2 3.9 
# 3 3 6.0 
# 4 4 8.1 
# 5 5 9.6 

è interessante notare che, otteniamo un diverso tipo di errore se y è un personaggio:

012.
y <- 'a' 
mutate(df, val = approx(time, val, time)$y) 
# Error: unsupported type for column 'val' (NILSXP, classes = NULL) 

Infine, per completezza, ecco un esempio che dimostra che questo è sicuramente non il comportamento usuale per l'estrazione lista:

l <- list(y = 1:4) 
y <- 'a' 
l$y 
# [1] 1 2 3 4 

Qualcuno sa il motivo per cui riusciamo ad ottenere questo strano comportamento all'interno mutate? E c'è un modo semplice per risolvere questo problema, oltre all'uso di doppie parentesi per l'estrazione o assicurando che non ci siano variabili in conflitto sul percorso di ricerca?

Tra l'altro, sembra che il PO nel seguente post potrebbe aver avuto lo stesso problema, ma non abbastanza rendono conto: dplyr mutate fails with named vector?

+2

sembra un bug. Puoi usare '$ 'y'', ma questo è solo un hack. – Frank

+1

Presenterei un [bug report] (https://github.com/hadley/dplyr/issues). L'estrazione della doppia parentesi sembra una soluzione molto ragionevole. Potresti anche fare una cosa divertente: 'mutate (df, val = \' $ \ '(approx (time, val, time)," y "))' – MrFlick

+0

In realtà, sembra che qualcuno abbia inviato questo come bug sei giorni fa: https://github.com/hadley/dplyr/issues/1554 – clbieganek

risposta

2

Come @clbieganek sottolineato, si tratta di un bug. E non è ancora fissata (come di dplyr versione 4.3)

possibile soluzione, come suggerito nei commenti:

$'y'

Questo è il problema che tiene traccia di questo problema generale: https://github.com/hadley/dplyr/issues/1400

Problemi correlati