如何在R语言pipe管道流中后续访问存储的行数统计对象
R语言管道流程统计过滤行数的实现方案
原有代码问题分析
现有实现依赖全局环境变量rows存储上一步行数,多步管道调用时容易因为作用域优先级、变量覆盖问题导致存储更新异常。
方案1:适配原有调用习惯的修正版
保留全局变量存储逻辑,补充参数确保跨环境赋值、取值生效:
n_before <- function(x) { assign("rows", nrow(x), envir = .GlobalEnv, inherits = TRUE) return(x) } n_excluded <- function(x) { current_exclude <- get("rows", envir = .GlobalEnv) - nrow(x) cat("本次过滤排除行数:", current_exclude, "\n") return(x) }
调用示例:
library(dplyr) iris %>% n_before() %>% filter(Sepal.Length > 5) %>% n_excluded() %>% n_before() %>% filter(Species == "setosa") %>% n_excluded()
方案2:无全局污染推荐版
将行数存储到数据集自定义属性中,不会产生全局冗余变量,稳定性更高:
n_before <- function(x) { attr(x, "last_rows") <- nrow(x) return(x) } n_excluded <- function(x) { current_exclude <- attr(x, "last_rows") - nrow(x) cat("本次过滤排除行数:", current_exclude, "\n") return(x) }
调用方式和方案1完全一致,执行后会依次打印每一步过滤排除的行数,数据集本身正常向下传递不影响后续管道操作。
内容的提问来源于stack exchange,提问作者Rasmus Larsen
相关产品推荐
相关产品推荐

