为了在json中编码字符串,需要使用反斜杠转义几个保留字符,并将每个字符串用双引号括起来。目前,jsonlite
包使用基本R中的deparse
函数实现了这一点:
deparse_vector <- function(x) {
stopifnot(is.character(x))
vapply(x, deparse, character(1), USE.NAMES=FALSE)
}
这个可以解决问题:
test <- c("line\nline", "foo\\bar", "I said: \"hi!\"")
cat(deparse_vector(test))
然而,对于大向量来说,
deparse
的速度较慢。另一种实现方法是逐个替换每个字符:gsub
。deparse_vector2 <- function(x) {
stopifnot(is.character(x))
if(!length(x)) return(x)
x <- gsub("\\", "\\\\", x, fixed=TRUE)
x <- gsub("\"", "\\\"", x, fixed=TRUE)
x <- gsub("\n", "\\n", x, fixed=TRUE)
x <- gsub("\r", "\\r", x, fixed=TRUE)
x <- gsub("\t", "\\t", x, fixed=TRUE)
x <- gsub("\b", "\\b", x, fixed=TRUE)
x <- gsub("\f", "\\f", x, fixed=TRUE)
paste0("\"", x, "\"")
}
这样做会更快一些,但不太美观。有更好的方法吗?(最好不需要额外的依赖项)
可以使用此脚本来比较实现:链接
> system.time(out1 <- deparse_vector1(strings))
user system elapsed
6.517 0.000 6.523
> system.time(out2 <- deparse_vector2(strings))
user system elapsed
1.194 0.000 1.194