gpt4 book ai didi

r - 如何覆盖 magrittr 管道运算符?

转载 作者:行者123 更新时间:2023-12-04 10:12:01 26 4
gpt4 key购买 nike

假设我有一个数据集,我想使用管道语法对其应用多个过滤器,如下所示:

library(magrittr)
library(dplyr)
mtcars %<>%
filter(cyl == 4) %>%
select(cyl, mpg)
nrow(mtcars)
#[1] 11

我用 nrow 检查数据集的当前状态在每个这样的步骤之后,所以我想我可以覆盖管道 %<>%运算符按照

`%<?>%` <- function(lhs, rhs) {
x <- magrittr::`%<>%`(lhs, rhs)
if (is.data.frame(x) & pipeVerbose) print(nrow(x))
}
#Using this will generate errors like
#Error in pipes[[i]] : subscript out of bounds

现在通过切换 pipeVerbose打开或关闭标记我将控制整个流程的跟踪过程。显然不是那么简单,因为内部评估机制,如提示here .问题是,是否有可能以最小的努力实现所需的行为,即不修补 magittr内部?

我不得不承认整个想法有点令人不安,但我的实际情况有点复杂,我想通过一个简单的开/关开关隐藏一些调试/开发细节以用于演示目的。

最佳答案

您可以使用 TaskCallback每当顶层任务完成时执行。在回调中检查表达式是否包含 %<>%运算符,如果是,则打印结果:

printAssignmentPipe <- function(exp, res, success, printed){

if (any(grepl("%<>%", exp, fixed = T))) {
print(res)
}
TRUE
}

addTaskCallback(printAssignmentPipe)

您可以轻松扩展回调以检查 pipeVerbose 的值或者您只需调用 addTaskCallbackremoveTaskCallback激活/停用。

关于r - 如何覆盖 magrittr 管道运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45236187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com