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