2013-08-13 7 views
7

Ich ging durch some examples in hadley's Anleitung zu Funktionalen und stieß auf ein unerwartetes Problem.

Angenommen, ich habe eine Liste von Modellobjekten,

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

und will etwas von jedem extrahieren (wie in Hadley Frage nach einer Liste namens „Studien“ vorgeschlagen). Ich habe erwartet, dass einer von diesen funktioniert:

Allerdings diese Rückkehr Nullen. Es scheint, als ob ich nicht die $ Funktion mißbrauchen, wie diese Dinge funktionieren:

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

Wie auch immer, ich mache das nur als Übung und sind gespannt, wo mein Fehler ist. Ich weiß, dass ich eine anonyme Funktion verwenden könnte, denke aber, dass es eine Möglichkeit geben muss, eine Syntax zu verwenden, die meiner anfänglichen Nicht-Lösung ähnlich ist. Ich habe die Plätze $ durchgesehen, die in ?Extract erwähnt wird, aber keine offensichtliche Erklärung sah.

Ich habe erkannt, dass dies funktioniert:

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

und diese

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

Vielleicht nur dies kommt unten einige lapply Voodoo, die anonyme Funktionen verlangt, wo keine nötig werden sollte? Ich habe das Gefühl, dass ich das schon mal irgendwo auf SO gehört habe.

+2

Kein Voodoo. Die "$" - Funktion wertet ihre Argumente nicht aus, während "[[". –

+3

@DWin - können Sie bitte erklären, ich verstehe nicht, was Sie damit meinen – eddi

+0

@Dwin Vielleicht ist das nur über meinen Kopf, aber ich bin nicht klar, was Bewertung bedeutet hier. Es scheint Args in Ordnung zu sein, wenn es direkt aufgerufen wird, wie in '\ $ {' (bah [[1]], i = 'call') '...? (argh: Inline-Backticks zu umgehen ist ärgerlich) – Frank

Antwort

4

Diese in ?lapply dokumentiert ist, in der "Note" Abschnitt (Hervorhebung von mir):

Aus historischen Gründen sind die von lapply erstellt Anrufe sind unbewertet, und Code geschrieben wurde (zB bquote), dass verlässt sich darauf. Dieser bedeutet, dass der aufgezeichnete Anruf immer die Form FUN(X[[0L]], ...) hat, wobei 0L durch den aktuellen Ganzzahlindex ersetzt wird. Dies ist nicht normalerweise ein Problem, aber es kann sein, wenn FUN verwendet sys.call oder match.call oder wenn es sich um eine primitive Funktion, die Nutzung des Anruf tätigt. Dies bedeutet, dass es oft sicherer ist, primitive Funktionen mit einem Wrapper aufzurufen, so dass z. lapply(ll, function(x) is.numeric(x)) wird in R 2.7.1 benötigt, um sicherzustellen, dass der Methodenversand für is.numeric korrekt erfolgt.

+0

Ich bin immer noch ein bisschen verwirrt - was für die '$' -Funktion ruft diese 'lapply (bah, \" $ \ ', 'call')' Ergebnis? Es ist anscheinend nicht '\' $ \ '(bah [[1L]], 'call')' so scheint ich diese Note zu lesen (wenn Sie '...' durch ''call'' und' FUN ersetzen 'mit' \ '$ \' '). – eddi

+4

'\' $ \ '(bah [[1L]], ...)' – Peyton

+0

@Peyton ahhh, ich sehe, danke! – eddi