Przeszedłem przez some examples w przewodniku hadleya do funkcjonałów i natknąłem się na nieoczekiwany problem.
Załóżmy, że mam listę obiektów modelu,
x=1:3;y=3:1; bah <- list(lm(x~y),lm(y~x))
i chcą, aby wyodrębnić coś od siebie (jak zasugerowano w Hadley pytanie o listę o nazwie „Badania”). Oczekiwano, że jeden z nich zadziała:
lapply(bah,`$`,i='call') # or...
lapply(bah,`$`,call)
Jednak te zwracają puste wartości. Wydaje się, że nie jestem nadużywania funkcji $
, jak te rzeczy działają:
`$`(bah[[1]],i='call')
`$`(bah[[1]],call)
W każdym razie, ja po prostu robi to jako ćwiczenie i jestem ciekaw, gdzie moja pomyłka jest. Wiem, że mógłbym użyć anonimowej funkcji, ale myślę, że musi istnieć sposób użycia składni podobnej do mojego początkowego braku rozwiązania. Sprawdziłem miejsca $
wymienione w ?Extract
, ale nie widziałem żadnego oczywistego wyjaśnienia.
Właśnie uświadomiłem sobie, że to działa:
lapply(bah,`[[`,i='call')
i to
lapply(bah,function(x)`$`(x,call))
Może tego właśnie sprowadza się do jakiegoś lapply
voodoo, który wymaga anonimowych funkcje gdzie powinny być potrzebne żadne? Czuję, że słyszałem to gdzieś na SO wcześniej.
Brak voodoo. Funkcja "$" nie ocenia jej argumentów, podczas gdy "[[" robi. –
@DWin - czy możesz wyjaśnić, nie rozumiem, co masz przez to na myśli? – eddi
@Dwin Może to jest tuż nad moją głową, ale nie mam pojęcia, co oznacza tutaj ocena. Wydaje się oceniać argumenty w porządku, gdy są wywoływane bezpośrednio, tak jak w '\' $ \ '(bah [[1]], i = 'call')' ...? (argh: unikanie inline backticks jest denerwujące) – Frank