Ho lavorato su alcuni progetti che mi hanno richiesto di eseguire molte sottotitoli di elenchi e mentre creavo il codice di profilo mi sono reso conto che l'oggetto [["nomeHere"]] si avvicinava agli elenchi di subsetting di solito era più veloce dell'oggetto $ nameHere approccio.
Per fare un esempio se creiamo una lista con i componenti nominati:
a.long.list <- as.list(rep(1:1000))
names(a.long.list) <- paste0("something",1:1000)
Perché è questo:
system.time (
for (i in 1:10000) {
a.long.list[["something997"]]
}
)
user system elapsed
0.15 0.00 0.16
più veloce di questo:
system.time (
for (i in 1:10000) {
a.long.list$something997
}
)
user system elapsed
0.23 0.00 0.23
La mia domanda è semplicemente se questo comportamento è vero universalmente e dovrei evitare il sottoinsieme $ ove possibile o fare il c più efficiente la scelta dipende da altri fattori?
+1. Sospetto che sia legato alla corrispondenza parziale con il segno '$'. Supponiamo di avere 'my_list <- list (" a "= 1," asso "= 2)'. Se provi 'my_list $ ac' ottiene' asso', ma se provi 'my_list [[" ac "]]', non trova nulla. – Frank
Non rispondendo alla tua domanda, ma se le prestazioni fossero un problema, allora preferiresti scrivere una query di ricerca vettorizzata <- sample (names (a.long.list), 1000); a.long.list [query] 'per giocare bene con il tuo altro codice vettoriale. –
non escludendo la teoria della corrispondenza parziale, ma quello che spero che una risposta completa includa è perché aggiungendo 'exact = FALSE' a' [['nell'esempio dell'OP non diminuisce la performance. – flodel