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

8
请看以下内容:
> n <- 1:4
> n
[1] 1 2 3 4

我希望将 n 转换为字符串 '1', '2', '3', '4' (在 R 中显示为 "'1', '2', '3', '4'")。这通常发生在我使用带有变量字符串的 sqlQuery() 时。不幸的是,我对正则表达式不够熟悉,无法轻松执行此操作。到目前为止,我最接近的是:
> paste0(n, collapse = "", sep = ",")
[1] "1,2,3,4,"

该代码没有在每个数字周围放置单引号,并且在末尾有额外的逗号。


1
sep="','"(注意多余的 '),然后在您获得的整个字符串周围再放置另一组 '"'" + paste0(...) + "'",基本上是这样。 - Marc B
@nrussell 可以将其发布为答案。如果您能解释一下'%d'的含义,我会很感激。谢谢。 - Clarinetist
1个回答

10

一个选择是使用sprintfpaste0

paste0(sprintf("'%d'", 1:4), collapse = ", ")
#[1] "'1', '2', '3', '4'"

%d是C语言家族格式化函数(printfsprintf等)中有符号整数的标准格式化标志。您可以在帮助文件(?sprintf)中查看各种选项。

我喜欢这种方式胜过其他替代方案,因为sprintf调用处理单个元素的格式化,而paste0(..., collapse = "<whatever>")则处理组合元素的操作;不过,您的意见可能不同。


当我需要生成冗余表达式以复制到SQL Server或生成C++宏时,我经常使用sprintfcatpaste0和其他函数结合使用。例如,一堆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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接