如何创建一个反转粘贴参数的顺序的函数?
默认情况下,如何创建一个反转粘贴参数的顺序的函数?
paste('hi', 'there')
[1] "hi there"
如果我想要一个功能,它下面?
reverse_paste('hi','there')
[1] "there hi "
有没有办法修改...
的元素来获得第二个结果?
我不知道如何处理...
参数在这种情况下,我想通过apply
使用功能,以连接的数据帧的内容提出了使用expand.grid
(粘贴的顺序是相反的扩张,而这两个订单都很重要)。
编辑:我想澄清一点,我也想能够使用sep
和collapse
关键字参数。
您可以使用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"
但是,如果你使用这apply
paste
到数据帧,这不会因为你没有实际使用多个参数来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
}
这是一个很好的机会从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_dv
从paste
创建了一个新的功能,是的点参数被替换为向量参数(dv
应被理解为dots
vector
。
所以lift_dv(paste)
是一个带有向量参数而不是点的函数。
as_mapper
创建一个新函数,该函数将类似于lift_dv(paste)
,但会反转向量参数。
lift_vd
转换回这个向量参数的参数点
我会稍后再看看,但为了提供一些清晰的原因,您能否解释这些不同的功能在做什么?它看起来很有趣。 –
我澄清了一下:) –
诚然,它更简单,如果你只是允许一个单一的输入,这是所有你需要为这个目的。尽管如此,你可以通过使用'rev'函数来改进函数;看看你能弄清楚如何! – Aaron
我希望能够使用'collapse'和'sep'参数,但(会更新发布以反映这一点)。 –
@maederayati:你应该也可以添加这个。我愿意跳进去,但这是你的回答,所以想给你第一个答案。 :) – Aaron