2012-06-16 15 views
16

Esto me puso bastante mal. Puede abreviar nombres de lista? Nunca antes lo había notado y estuve totalmente jodido por un día. ¿Puede alguien explicar lo que está sucediendo aquí y por qué podría ser más útil de lo que es terrible? ¿Y por qué es inconsistente así en la parte inferior? Y si puedo apagarlo?¿Puede abreviar nombres de lista? ¿Por qué?

> 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

No es inconsistente. Las subcadenas principales de nombres se resuelven solo si existe una coincidencia única. –

+1

+1 por hacerme pensar * por qué * '$' se implementa de esta manera. –

+0

Esto se remonta a los primeros días de S en los laboratorios Bell. Es algo malo, pero todavía lo uso a veces para guardar la escritura. También funciona en argumentos de función, por ejemplo 'predict (m, type =" resp ")' o 'cor (x, y, use =" pair ")'. –

Respuesta

16

Sospecho que la concordancia parcial por el operador $ era una buena característica (r) para uso interactivo en los días antes de la finalización con pestañas se había aplicado

Si no te gusta que el comportamiento, puede utilizar la "[[" operador en su lugar. Lleva un argumento exact=, que le permite controlar el comportamiento de coincidencia parcial, y que tiene como valor predeterminado 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' 

(Esta es una razón por "[[" generalmente se prefiere $ en la programación R. Otra es la capacidad de hacer esto X <- "whatisthe"; wtf[[X]] pero no este X <- "whatisthe"; wtf$X.)

+0

Genial, gracias. Estoy seguro de que se supone que la autocompleta es útil, pero se siente algo siniestro. Solo estoy esperando que muerda nuevamente. – enfascination

+0

@ user1073999 - Estoy de acuerdo. Incluso siento que he visto a algunos de los directores de R quejarse de esa decisión temprana de diseño, pero ahora no puedo recordar dónde. Me interesaría que alguien más haya visto eso. –

+2

Pensándolo mejor, puedo ver que habría sido útil en el uso interactivo antes de que se hubiera implementado el autocompletado con pestañas. –

2

Para los nombres de la lista de elementos (y nombres de los parámetros de función), R se aplica el siguiente algoritmo:

Si hay una coincidencia exacta para el elemento, lo utilizan. Si no hay una coincidencia exacta, busque coincidencias parciales. Si hay exactamente una coincidencia parcial, úselo. De lo contrario, no use nada.

+0

Creo que el algoritmo completo también usa la coincidencia de posición. – Andrie

+0

¿Puedes elaborar? Por ejemplo '> a <- function (aa, ab) {paste (aa, ab, sep = "")}' '> a (a = 1, a = 2)' 'Error en a (a = 1, a = 2): argumento formal "aa" emparejado por múltiples argumentos reales ' –

+0

Simplemente estoy observando que no tiene que nombrar el argumento, en cuyo caso R usa la coincidencia de posición. Ya que puede mezclar el caso de tener nombres de argumento y sin nombres, una respuesta completa debería mencionar esto, en mi opinión. Por lo tanto, en su ejemplo 'a (1, ab = 2)' seguirá funcionando, al igual que 'a (ab = 2, 1)'. – Andrie

Cuestiones relacionadas