2012-06-16 13 views
16

Questo mi ha fatto piuttosto male. Puoi abbreviare i nomi delle liste? Non l'ho mai notato prima e sono stato completamente fregato per un giorno. Qualcuno può spiegare cosa sta succedendo qui e perché potrebbe essere più utile di quanto sia terribile? E perché è incoerente come quello in fondo? E se posso spegnerlo?È possibile abbreviare i nomi degli elenchi? Perché?

> wtf <- list(whatisthe=1, pointofthis=2) 
> wtf$whatisthe 
[1] 1 
> wtf$what 
[1] 1 

> wtf <- list(whatisthe=1, whatisthepointofthis=2) 
> wtf$whatisthepointofthis 
[1] 2 
> wtf$whatisthep 
[1] 2 
> wtf$whatisthe 
[1] 1 
> wtf$what 
NULL 
+5

Non è incoerente. Le sottostringhe principali dei nomi sono risolte se e solo se esiste una corrispondenza unica. –

+1

+1 per avermi fatto pensare a * perché * '$' è implementato in questo modo. –

+0

Questo risale ai primi giorni di S nei laboratori Bell. È una brutta cosa, ma a volte lo uso ancora per risparmiare la digitazione. Funziona anche con argomenti di funzione, ad esempio 'predicti (m, type =" resp ")' o 'cor (x, y, use =" pair ")'. –

risposta

16

Ho il sospetto che una corrispondenza parziale dall'operatore $ era una cosa bella (r) per l'uso interattivo indietro nei giorni prima del completamento a schede era stato attuato

Se non ti piace che il comportamento, è possibile utilizzare il "[[" operatore. Prende un argomento exact=, che consente di controllare il comportamento di corrispondenza parziale e quale valore predefinito su TRUE.

wtf[["whatisthep"]]     # Only returns exact matches 
# NULL 

wtf[["whatisthep", exact=FALSE]] # Returns partial matches without warning 
# [1] 2 

wtf[["whatisthep", exact=NA]]  # Returns partial matches & warns that it did 
# [1] 2 
# Warning message: 
# In wtf[["whatisthep", exact = NA]] : 
# partial match of 'whatisthep' to 'whatisthepointofthis' 

(Questo è uno dei motivi per cui "[[" preferisce generalmente $ in programmazione R. Un altro è la capacità di fare questo X <- "whatisthe"; wtf[[X]] ma non questo X <- "whatisthe"; wtf$X.)

+0

Grande, grazie. Sono sicuro che l'autocomplete dovrebbe essere d'aiuto, ma sembra solo un po 'inquietante. Sto solo aspettando che morda di nuovo. – enfascination

+0

@ user1073999 - Sono d'accordo. Mi sento anche come se avessi visto alcuni dei presidenti della R lamentarsi di quella decisione iniziale del design, ma non posso ora ricordare dove. Sarei interessato se qualcun altro l'avesse visto. –

+2

Su ulteriore pensiero, posso vedere che sarebbe stato utile in uso interattivo prima che il completamento automatico a schede fosse stato implementato. –

2

Per i nomi di elenco di elementi (e nomi dei parametri di funzione), R si applica il seguente algoritmo:

Se v'è una corrispondenza esatta per la voce, usarlo. Se non c'è una corrispondenza esatta, cerca le corrispondenze parziali. Se c'è esattamente una corrispondenza parziale, usala. Altrimenti, non usare nulla.

+0

Penso che l'algoritmo completo usi anche la corrispondenza posizionale. – Andrie

+0

Puoi elaborare? Ad esempio '> a <- function (aa, ab) {paste (aa, ab, sep = "")}' '> a (a = 1, a = 2)' 'Errore in a (a = 1, a = 2): argomento formale "aa" corrispondente a più argomenti effettivi " –

+0

Sto semplicemente osservando che non è necessario denominare l'argomento, nel qual caso R usa la corrispondenza posizionale. Dal momento che puoi mescolare il caso di avere nomi di argomenti e nessun nome, una risposta completa dovrebbe menzionarlo, secondo me. Quindi, nel tuo esempio 'a (1, ab = 2)' funzionerà ancora, così come 'a (ab = 2, 1)'. – Andrie

Problemi correlati