如何创建一个反转粘贴参数的顺序的函数?

问题描述:

默认情况下,如何创建一个反转粘贴参数的顺序的函数?

paste('hi', 'there') 
[1] "hi there" 

如果我想要一个功能,它下面?

reverse_paste('hi','there') 
[1] "there hi " 

有没有办法修改...的元素来获得第二个结果?

我不知道如何处理...参数在这种情况下,我想通过apply使用功能,以连接的数据帧的内容提出了使用expand.grid(粘贴的顺序是相反的扩张,而这两个订单都很重要)。

编辑:我想澄清一点,我也想能够使用sepcollapse关键字参数。

您可以使用list获取...中的参数。然后,您只需要将其反转,添加其他参数并致电paste

paste_rev <- function(..., sep=" ", collapse=NULL) { 
    arg <- c(rev(list(...)), list(sep=sep, collapse=collapse)) 
    do.call(paste, arg) 
} 
paste_rev(c("a1", "a2"), c("b", "c"), sep=".") 
## [1] "b.a1" "c.a2" 

但是,如果你使用这applypaste到数据帧,这不会因为你没有实际使用多个参数来paste工作,你是不是发送它的向量。

out <- expand.grid(a=c("a1", "a2"), b=c("b1", "b2"), stringsAsFactors=FALSE) 
out 
## a b 
## 1 a1 b1 
## 2 a2 b1 
## 3 a1 b2 
## 4 a2 b2 
apply(out, 1, paste_rev, collapse=".") 
## [1] "a1.b1" "a2.b1" "a1.b2" "a2.b2" 

相反,我只是在粘贴前颠倒了列的顺序。或者,逐个反转每个参数的元素。

paste_rev2 <- function(..., sep=" ", collapse=NULL) { 
    arg <- c(lapply(list(...), rev), list(sep=sep, collapse=collapse)) 
    do.call(paste, arg) 
} 
apply(out, 1, paste_rev2, collapse=".") 
## [1] "b1.a1" "b1.a2" "b2.a1" "b2.a2" 

对于可以执行任何操作的泛型函数,您可以添加几个参数。

pasteX <- function(..., sep=" ", collapse=NULL, 
         rev.elements=FALSE, rev.arguments=FALSE) { 
    arg <- list(...) 
    if(rev.arguments) arg <- rev(arg) 
    if(rev.elements) arg <- lapply(arg, rev) 
    do.call(paste, c(arg, list(sep=sep, collapse=collapse))) 
} 
pasteX(c("a", "b"), c(1, 2)) 
## [1] "a 1" "b 2" 
pasteX(c("a", "b"), c(1, 2), rev.elements=TRUE) 
## [1] "b 2" "a 1" 
pasteX(c("a", "b"), c(1, 2), rev.arguments=TRUE) 
## [1] "1 a" "2 b" 
pasteX(c("a", "b"), c(1, 2), rev.elements=TRUE, rev.arguments=TRUE) 
## [1] "2 b" "1 a" 

尝试以下功能:

reverse_paste<-function(x){ 
    a<-"" 
    for(i in length(x):1) 
     a<-paste(a,x[i]) 
    a 
} 
+0

诚然,它更简单,如果你只是允许一个单一的输入,这是所有你需要为这个目的。尽管如此,你可以通过使用'rev'函数来改进函数;看看你能弄清楚如何! – Aaron

+0

我希望能够使用'collapse'和'sep'参数,但(会更新发布以反映这一点)。 –

+0

@maederayati:你应该也可以添加这个。我愿意跳进去,但这是你的回答,所以想给你第一个答案。 :) – Aaron

这是一个很好的机会从purrr测试lift家庭的功能:

library(purrr) 
rev_paste <- lift_vd(as_mapper(~lift_dv(paste)(rev(.x)))) 
rev_paste("hi","there") 
# [1] "there hi" 
rev_paste("hi","there",sep=", ") 
# [1] "there, hi" 

lift_dvpaste创建了一个新的功能,是的点参数被替换为向量参数(dv应被理解为dotsvector

所以lift_dv(paste)是一个带有向量参数而不是点的函数。

as_mapper创建一个新函数,该函数将类似于lift_dv(paste),但会反转向量参数。

lift_vd转换回这个向量参数的参数点

+0

我会稍后再看看,但为了提供一些清晰的原因,您能否解释这些不同的功能在做什么?它看起来很有趣。 –

+0

我澄清了一下:) –