R: Por que a abordagem [[]] para subconjuntos de uma lista é mais rápida do que usar $?

Eu tenho trabalhado em alguns projetos que me obrigaram a fazer um monte de subconjuntos de listas e, ao criar o código, percebi que a abordagem do objeto [["nameHere"]] às listas de subconjuntos era geralmente mais rápida que a abordagem $ nameHere do objeto.

Como exemplo, se criarmos uma lista com componentes nomeados:

a.long.list <- as.list(rep(1:1000))
names(a.long.list) <- paste0("something",1:1000)

Por que é isso:

system.time (
for (i in 1:10000) {
    a.long.list[["something997"]]
}
)


user  system elapsed 
0.15    0.00    0.16 

mais rápido que isso:

system.time (
    for (i in 1:10000) {
        a.long.list$something997
    }
)

user  system elapsed 
0.23    0.00    0.23 

Minha pergunta é simplesmente se esse comportamento é verdadeiro universalmente e eu deveria evitar o subconjunto de $ sempre que possível ou a escolha mais eficiente depende de alguns outros fatores?

questionAnswers(1)

yourAnswerToTheQuestion