我可以在不使用 apply 的情况下附加这个字符向量吗?

Could I have appended this vector of characters without using apply?

我最近生成了这个输出:

> RcppAlgos::permuteGeneral(c("G","R","S","H"),2)
      [,1] [,2]
 [1,] "G"  "R" 
 [2,] "G"  "S" 
 [3,] "G"  "H" 
 [4,] "R"  "G" 
 [5,] "R"  "S" 
 [6,] "R"  "H" 
 [7,] "S"  "G" 
 [8,] "S"  "R" 
 [9,] "S"  "H" 
[10,] "H"  "G" 
[11,] "H"  "R" 
[12,] "H"  "S" 

我的目标是将其转换为:

G vs R
G vs S
G vs H
R vs G
R vs S
R vs H
S vs G
S vs R
S vs H
H vs G
H vs R
H vs S

我的最终解决方案是 writeLines(apply(RcppAlgos::permuteGeneral(c("G","R","S","H"),2),1,function(x) paste(x,collapse = " vs "))),但这不是我想要的。特别是, writeLines 打印输出而不是返回它,我看不出为什么我需要使用 writeLines 来获得所需的换行符(据我所知,向 [=15 添加 \n 参数=] 应该已经足够了,但实际上它什么也没做)。

然而,最令我惊讶的是我需要使用 apply。如果我没记错的话,paste 已经矢量化了,所以 paste 本身或者 sapplypaste 应该就足够了。有什么办法可以不使用 apply 来实现我的目标吗?可能有一个 tidyverse one-liner 为此,但我更喜欢看到一个惯用的基础 R 解决方案。

您可以在 permuteGeneral 中传递函数:

unlist(RcppAlgos::permuteGeneral(c("G","R","S","H"),2, 
       FUN = function(x) paste(x, collapse  = ' vs ')))

#[1] "G vs R" "G vs S" "G vs H" "R vs G" "R vs S" "R vs H"
#[7] "S vs G" "S vs R" "S vs H" "H vs G" "H vs R" "H vs S"

如果数据已经生成我们可以使用

data <- RcppAlgos::permuteGeneral(c("G","R","S","H"),2)
paste(data[, 1], data[, 2], sep = ' vs ')

而且如果栏目很多又不想单独写的话

do.call(paste, c(data.frame(data), sep = ' vs '))