R 如何在自定义管道中实现点占位符?
我正在编写自定义管道,希望其工作方式与%>%类似: 使用此选项:R 如何在自定义管道中实现点占位符?,r,R,我正在编写自定义管道,希望其工作方式与%>%类似: 使用此选项: abc <- c(1,2,3,4,5) abc %mypipe% data.frame(a = ., b= 2 *., c = 3*.) %mypipe% filter(b>6) 我可以定义%mypipe%,但当我使用dot时,我的代码失败了 `%mypipe%` <- function (lhs, rhs) { rhs_call <- substitute(rhs) eval(rh
abc <- c(1,2,3,4,5)
abc %mypipe% data.frame(a = ., b= 2 *., c = 3*.) %mypipe% filter(b>6)
我可以定义%mypipe%,但当我使用dot时,我的代码失败了
`%mypipe%` <-
function (lhs, rhs) {
rhs_call <- substitute(rhs)
eval(rhs_call, envir = list(. = lhs), enclos = parent.frame())
}
`%mypipe%`实现点占位符比实现管道更难,因为需要递归地替换管道调用中表达式中捕获的点。这一切都变得有点难以解释。您甚至必须递归地构建和eval
调用自己内部的点替换函数
以下是一个(大致)可行的实施方案:
replace_dot实现点占位符比实现管道更难,因为需要递归地替换管道调用中表达式中捕获的点。这一切都变得有点难以解释。您甚至必须递归地构建和eval
调用自己内部的点替换函数
以下是一个(大致)可行的实施方案:
replace\u dot你能不能也分享一下你的%mypipe%
函数的代码?@alex\u jwb90我编辑了我的问题这个问题是对过滤器的调用
-代码不强制lhs作为rhs的第一个参数。@Cole你知道如何让管道强制它吗?如果你想让它像%>%
,然后您可能应该查看magrittr
包源代码。事实上,我认为@AllenCameron做得很好。你也可以分享你的%mypipe%
函数的代码吗?@alex_jwb90我编辑了我的问题这个问题是对过滤器的调用
-代码不强制lhs作为rhs的第一个参数。@Cole你知道如何让管道强制它吗?如果你想让它像%%>%%
,那么您可能应该查看magrittr
包源代码。事实上,我认为@AllenCameron做得很好。不幸的是,它不能与cbind一起正常工作。@IziBizi如果我使用abc%>%cbind(.)
我会得到一个包含两列abc
的矩阵,这正是我所期望的。“它不工作”是什么意思?当我执行abc%>%cbind(,data.frame(d=.$c*2))
时,我的输出有两个abc列。当然,如果我把{cbind()}放进去就行了,但是你认为我不使用这些括号就能正确地得到它吗?@IziBizi但是你为什么要放第一个点呢?在管道操作符中,左手边作为第一个参数传递,因此执行abc%>%cbind(,data.frame(d=.$c*2))
与写入cbind(abc,abc,data.frame(d=.$c*2))
相同。你得到abc两次,因为你要求它两次。尝试一下abc%>%cbind(data.frame(d=.c$*2))
@IziBizi我已经解决了这个问题。请记住,实际的管道操作员需要几个经过多年发展和测试的相关功能。在堆栈溢出应答中期望完整副本是不合理的。我认为这将处理大多数用例,应该会给你一个好分数。你应该研究它,以便在必要时进行调整。祝你好运不幸的是,它不能与例如cbind一起正常工作。@IziBizi如果我使用abc%>%cbind(.)
我会得到一个包含两列abc
的矩阵,这是我所期望的。“它不工作”是什么意思?当我执行abc%>%cbind(,data.frame(d=.$c*2))
时,我的输出有两个abc列。当然,如果我把{cbind()}放进去就行了,但是你认为我不使用这些括号就能正确地得到它吗?@IziBizi但是你为什么要放第一个点呢?在管道操作符中,左手边作为第一个参数传递,因此执行abc%>%cbind(,data.frame(d=.$c*2))
与写入cbind(abc,abc,data.frame(d=.$c*2))
相同。你得到abc两次,因为你要求它两次。尝试一下abc%>%cbind(data.frame(d=.c$*2))
@IziBizi我已经解决了这个问题。请记住,实际的管道操作员需要几个经过多年发展和测试的相关功能。在堆栈溢出应答中期望完整副本是不合理的。我认为这将处理大多数用例,应该会给你一个好分数。你应该研究它,以便在必要时进行调整。祝你好运
`%mypipe%` <-
function (lhs, rhs) {
rhs_call <- substitute(rhs)
eval(rhs_call, envir = list(. = lhs), enclos = parent.frame())
}
abc %mypipe% data.frame(a = ., b= 2 *., c = 3*.) %mypipe% select(c,b)
#> c b
#> 1 3 2
#> 2 6 4
#> 3 9 6
#> 4 12 8
#> 5 15 10