lapply con la funzione “$”

Stavo esaminando alcuni esempi nella guida di hadley ai funzionali, e ho trovato un problema inaspettato.

Supponiamo che io abbia una lista di oggetti modello,

x=1:3;y=3:1; bah <- list(lm(x~y),lm(y~x)) 

e vogliono estrarre qualcosa da ciascuno (come suggerito nella domanda di Hadley su una lista chiamata “prove”). Mi aspettavo che uno di questi funzionasse:

 lapply(bah,`$`,i='call') # or... lapply(bah,`$`,call) 

Tuttavia, restituiscono valori null. Sembra che non stia abusando della funzione $ , poiché queste cose funzionano:

 `$`(bah[[1]],i='call') `$`(bah[[1]],call) 

Ad ogni modo, lo faccio solo come esercizio e sono curioso di sapere dove si trova il mio errore. So che potrei usare una funzione anonima, ma penso che ci debba essere un modo per usare la syntax simile alla mia non-soluzione iniziale. Ho esaminato i luoghi in cui è menzionato $ ?Extract , ma non ho visto alcuna spiegazione ovvia.

    Ho appena realizzato che questo funziona:

     lapply(bah,`[[`,i='call') 

    e questo

     lapply(bah,function(x)`$`(x,call)) 

    Forse si tratta solo di un voodoo lapply che richiede funzioni anonime in cui nessuno dovrebbe essere necessario? Mi sembra di averlo sentito da qualche parte su SO prima.

    Questo è documentato in ?lapply , nella sezione “Note” (enfasi mia):

    Per ragioni storiche, le chiamate create da lapply sono state valutate e il codice è stato scritto (ad esempio bquote ) che si basa su questo. Ciò significa che la chiamata registrata è sempre nella forma FUN(X[[0L]], ...) , con 0L sostituito dall’indice intero corrente. Questo normalmente non è un problema, ma può esserlo se FUN usa sys.call o match.call o se è una funzione primitiva che fa uso della chiamata. Ciò significa che è spesso più sicuro chiamare le funzioni primitive con un wrapper, in modo che ad es. lapply(ll, function(x) is.numeric(x)) sia richiesto in R 2.7.1 per assicurare che il metodo di invio sia is.numeric correttamente.