9.3 管道操作
Stefan Milton Bache 开发了 magrittr 包实现管道操作,增加代码的可读性和维护性,但是这个 R 包的名字取的太奇葩,因为 记不住,它其实是一个复杂的法语发音,中式英语就叫它马格里特吧!这下应该好记多了吧!
我要查看是否需要新添加一个 R 包依赖,假设该 R 包是 reticulate 没有出现在 DESCRIPTION 文件中,但是可能已经被其中某(个)些 R 包依赖了
"reticulate" %in% sort(unique(unlist(tools::package_dependencies(desc::desc_get_deps()$package, recursive = TRUE))))## [1] FALSE
安装 pkg 的依赖
pkg <- c(
"bookdown",
"e1071",
"formatR",
"lme4",
"mvtnorm",
"prettydoc", "psych",
"reticulate", "rstan", "rstanarm", "rticles",
"svglite",
"TMB", "glmmTMB"
)
# 获取 pkg 的所有依赖
dep_pkg <- tools::package_dependencies(pkg, recursive = TRUE)
# 将列表 list 合并为向量 vector
merge_pkg <- Reduce("c", dep_pkg, accumulate = FALSE)
# 所有未安装的 R 包
miss_pkg <- setdiff(unique(merge_pkg), unique(.packages(TRUE)))
# 除了 pkg 外,未安装的 R 包,安装 pkg 的依赖
sort(setdiff(miss_pkg, pkg))## [1] "bayesplot" "BH" "colourpicker" "distributional"
## [5] "dygraphs" "gtools" "inline" "loo"
## [9] "mnormt" "posterior" "RcppParallel" "rstantools"
## [13] "shinyjs" "shinystan" "shinythemes" "StanHeaders"
## [17] "tensorA" "threejs" "xts"
转化为管道操作,增加可读性
再举一个关于数据模拟的例子
模拟 0-1 序列,
set.seed(2019)
binom_sample <- function(n) {
sum(sample(x = c(0,1), size = n, prob = c(0.8, 0.2), replace = TRUE))/n
}
# 频率估计概率
one_prob <- sapply(10^(seq(8)), binom_sample)
# 估计的误差
one_abs <- abs(one_prob - 0.2)
one_abs## [1] 1.000e-01 1.000e-02 1.100e-02 4.400e-03 1.460e-03 3.980e-04 4.700e-06
## [8] 9.552e-05
似然估计