में वर्ण वैक्टरों की तेजी से भागना/छेड़छाड़ करना जेसन में तारों को एन्कोड करने के लिए, कई आरक्षित पात्रों को बैकस्लैश से बचने की आवश्यकता होती है, और प्रत्येक स्ट्रिंग को डबल कोट्स में लपेटने की आवश्यकता होती है। वर्तमान में jsonlite
पैकेज इस लागू करता आधार आर में 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, "\"")
}
इसमें कुछ समय तेजी से होता है, लेकिन बहुत ज्यादा नहीं है और एक सा बदसूरत भी। ऐसा करने का एक बेहतर तरीका क्या होगा? (अधिमानतः अतिरिक्त निर्भरता के बिना)
यह script कार्यान्वयन तुलना करने के लिए इस्तेमाल किया जा सकता:
> 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
आप कम से कम पोस्ट कुछ समय आपके द्वारा किए गए ताकि हमें पता चल सकता है कि क्या "काफी तेजी से" हो सकता है? – MrFlick
मैंने कार्यान्वयन की तुलना करने के लिए एक स्क्रिप्ट का एक लिंक जोड़ा। – Jeroen