2017-03-27 2 views
0

Ich habe vor kurzem versucht, map_dbl in einem Code zu verwenden, wo sapply hatte gut funktioniert, und stolperte über die Inkonsistenz unten. Was ist los mit dir?Warum kann ich nicht purrr :: map diese Liste ohne anonyme Funktion (sapply funktioniert)

library(nlme) 
fm1 = nlsList(uptake ~ SSasympOff(conc, Asym, lrc, c0), 
       data = CO2, start = c(Asym = 30, lrc = -4.5, c0 = 52)) 
# Ok 
deviance = sapply(fm1, function(x) deviance(x)) 
deviance = sapply(fm1, deviance) 
deviance = purrr::map_dbl(fm1, function(x) deviance(x)) 

# fails 
deviance = purrr::map_dbl(fm1, deviance) 
# Error: Result 1 is not a length 1 atomic vector 
str(deviance(fm1[[1]])) 
# num 11.1 

Antwort

3

purrr nicht deviance als Funktion interpretieren, wie Sie eine Funktion deviance und eine Variable (in der globalen env) deviance

purrr intern verwendet as_function auf das zweite Argument genannt haben. Also in Ihrem Fall:

deviance = sapply(fm1, deviance) 
class(deviance) # "numeric" 

In diesem Sinne deviance wird als Zahlenvektor interpretiert. Von ?map

Wenn Zeichen oder ganzzahliger Vektor, z. "y" wird in eine Extraktorfunktion umgewandelt, Funktion (x) x [["y"]]. Verwenden Sie mehrere Werte, um tief in eine geschachtelte -Liste zu indizieren; c ("x", "y") entspricht z [["x"]] [["y"]]. Sie können auch .null festlegen, um einen Standardwert für die Verwendung von anstelle von NULL für abwesende Komponenten festzulegen.

Die folgenden Werke:

rm(deviance) 
my_deviance = purrr::map_dbl(fm1, deviance) 

wie auch:

purrr::map_dbl(fm1, ~deviance(.x)) 

und:

deviance = sapply(fm1, deviance) 
map_dbl(fm1, stats::deviance) 

und (als @Axeman mendions in den Kommentaren)

purrr::map_dbl(fm1, match.fun(deviance)) 
+3

Oder 'purrr :: map_dbl (fm1, match.fun (Abweichung))'. – Axeman

+1

Sh ... Ich habe gerade bemerkt, dass das meine eigene schlechte Programmierpraxis ist, nicht die von nlme. Entschuldige meine Dummheit. –

Verwandte Themen