为什么我不能purrr ::没有匿名函数映射这个列表(sapply works)

时间:2017-03-27 09:52:47

标签: r sapply purrr

我最近尝试在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

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))