我认为我会这样做,通过调整magrittr pipes来包含这个新选项。这种方式应该相当强大。
首先,我们需要在magrittr的函数
is_pipe
中插入一个新选项,以确定某个函数是否是管道。我们需要让它识别
%W>%
。
new_is_pipe = function (pipe)
{
identical(pipe, quote(`%>%`)) || identical(pipe, quote(`%T>%`)) ||
identical(pipe, quote(`%W>%`)) ||
identical(pipe, quote(`%<>%`)) || identical(pipe, quote(`%$%`))
}
assignInNamespace("is_pipe", new_is_pipe, ns="magrittr", pos="package:magrittr")
`%W>%` = magrittr::`%>%`
我们还需要一个新的辅助函数来检查正在处理的管道是否为
%W>%
。
is_W = function(pipe) identical(pipe, quote(`%W>%`))
environment(is_W) = asNamespace('magrittr')
最后,我们需要在magrittr:::wrap_function
中加入一个新的分支,检查这是否是一个%W>%
管道。如果是,则在函数调用体中插入options(warn=-1)
和on.exit(options(warn=w))
。
new_wrap_function = function (body, pipe, env)
{
w <- options()$warn
if (magrittr:::is_tee(pipe)) {
body <- call("{", body, quote(.))
}
else if (magrittr:::is_dollar(pipe)) {
body <- substitute(with(., b), list(b = body))
}
else if (is_W(pipe)) {
body <- as.call(c(as.name("{"), expression(options(warn=-1)), parse(text=paste0('on.exit(options(warn=', w, '))')), body))
}
eval(call("function", as.pairlist(alist(. = )), body), env, env)
}
assignInNamespace("wrap_function", new_wrap_function, ns="magrittr", pos="package:magrittr")
测试这个是否有效:
data.frame(a= c(1,-1)) %W>% mutate(a=sqrt(a)) %>% cos
与...相比较,...
data.frame(a= c(1,-1)) %>% mutate(a=sqrt(a)) %>% cos
rmonad::
包的intro vignette(以及其他内容)。这是一种很好的处理错误的方式,对于警告也可能同样有效。可能有些过度,但值得考虑。 - lefft