此问题与我的question about Roxygen.
有关我想编写一个新的函数,用于对字符串进行自动换行,类似于strwrap
或stringr::str_wrap
,但有以下几种:字符串中的任何元素(子字符串)不得允许用引号括起来。
因此,例如,使用以下示例数据
test <- "function(x=123456789, y=\"This is a long string argument\")"
cat(test)
function(x=123456789, y="This is a long string argument")
strwrap(test, width=40)
[1] "function(x=123456789, y=\"This is a long"
[2] "string argument\")"
我希望newWrapFunction(x, width=40, ...)
的所需输出为:
desired <- c("function(x=123456789, ", "y=\"This is a long string argument\")")
desired
[1] "function(x=123456789, "
[2] "y=\"This is a long string argument\")"
identical(desired, newWrapFunction(tsring, width=40))
[1] TRUE
你能想到办法吗?
PS。如果你可以帮我解决这个问题,我会建议将这段代码作为roxygen2
的补丁。我已经确定了应该应用此补丁的位置,并会确认您的贡献。
答案 0 :(得分:2)
这是我为了获得strwrap而做的所以它不会破坏空格上的单引号部分: A)在用单引号拆分后用“〜|〜”代替空格来预处理“偶数”部分: 定义新函数strwrapqt
....
zz <- strsplit(x, "\'") # will be only working on even numbered sections
for (i in seq_along(zz) ){
for (evens in seq(2, length(zz[[i]]), by=2)) {
zz[[i]][evens] <- gsub("[ ]", "~|~", zz[[i]][evens])}
}
zz <- unlist(zz)
.... insert just before
z <- lapply(strsplit) ...........
然后在最后用空格替换所有“〜|〜”。可能有必要更多地考虑其他类型的空白“事件”来获得完全正规的治疗。
....
y <- gsub("~\\|~", " ", y)
....
编辑:经过测试@joran的建议。使用我正在使用的方法匹配单引号和双引号将是一项艰巨的任务,但如果有人愿意将任何引用视为与分隔符目标同等有效,则可以在上面的代码中使用zz <- strsplit(x, "\'|\"")
作为拆分条件