在向量的每个元素周围加上引号,并用逗号分隔

Cla*_*ist 6 r

考虑以下:

> n <- 1:4
> n
[1] 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

我想转换,n以便我得到一个字符串'1', '2', '3', '4'(其中R,将显示为"'1', '2', '3', '4'").

当我使用sqlQuery()变量字符串时,通常会出现这种情况.遗憾的是,我对RegEx不够熟悉,无法轻松执行此操作.

我最接近的是

> paste0(n, collapse = "", sep = ",")
[1] "1,2,3,4,"
Run Code Online (Sandbox Code Playgroud)

它不会在每个数字周围加上单引号,并且最后会有额外的逗号.

nru*_*ell 8

一种选择是使用sprintfpaste0,

paste0(sprintf("'%d'", 1:4), collapse = ", ")
#[1] "'1', '2', '3', '4'"
Run Code Online (Sandbox Code Playgroud)

其中%d是用于从C家族的格式化功能(带符号的整数的标准格式标志printf,sprintf等).您可以在帮助文件(?sprintf)中看到各种选项.

我更喜欢这个替代方案,因为sprintf调用解决了单个元素的格式,而paste0(..., collapse = "<whatever>")处理元素的组合; 不过,您的意见可能有所不同.


我经常使用sprintf&cat,结合paste0等功能,当我需要生成冗余表达式来复制到SQL Server或生成C++宏等.例如,一束的INSERT语句

cat(sprintf("INSERT INTO #tmp(x, y, z) VALUES('%s', %d, %.2f);", 
            letters[1:5], 1:5, rnorm(5)), 
    sep = "\n"
)
#INSERT INTO #tmp(x, y, z) VALUES('a', 1, -1.10);
#INSERT INTO #tmp(x, y, z) VALUES('b', 2, 0.24);
#INSERT INTO #tmp(x, y, z) VALUES('c', 3, -0.82);
#INSERT INTO #tmp(x, y, z) VALUES('d', 4, -0.46);
#INSERT INTO #tmp(x, y, z) VALUES('e', 5, 0.72);
Run Code Online (Sandbox Code Playgroud)