我最近尝试在map_dbl
运行良好的某些代码中使用sapply
,并在下面的不一致中偶然发现。怎么了?
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
答案 0 :(得分:3)
purrr
并不将deviance
解释为函数,因为您有一个函数deviance
和一个名为deviance
的变量(在全局环境中)
purrr
在第二个参数内部使用as_function
。所以在你的情况下:
deviance = sapply(fm1, deviance)
class(deviance) # "numeric"
在这个意义上,deviance
被解释为数字向量。来自?map
如果是字符或整数矢量,例如" y",它被转换为 提取函数,函数(x)x [[" y"]]。深入索引到 嵌套列表,使用多个值; c(" x"," y")相当于 Z [[" X"]] [[" Y"]]。您还可以设置.null来设置要使用的默认值 缺少组件而不是NULL。
以下作品:
rm(deviance)
my_deviance = purrr::map_dbl(fm1, deviance)
同样如下:
purrr::map_dbl(fm1, ~deviance(.x))
和
deviance = sapply(fm1, deviance)
map_dbl(fm1, stats::deviance)
和(评论中的@Axeman mendions)
purrr::map_dbl(fm1, match.fun(deviance))