2011-09-09 20 views
5

這個問題是關係到我question about Roxygen.包裝字符串,但沒有加串,,使用R

我想編寫一個新的函數,它串的文字換行,類似於strwrapstringr::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的補丁。我已經確定了這個補丁應該應用在哪裏,並且會承認你的貢獻。

回答

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) 
.... 

編輯:測試@喬蘭的建議。使用我正在使用的方法來匹配單引號和雙引號是一項艱鉅的任務,但如果有人願意將任何引號視爲與分隔符目標同等有效,則可以在上面的代碼中使用zz <- strsplit(x, "\'|\"")作爲分割標準。

+0

整潔。 @Andrie沒有指定單引號和雙引號,但是可能在「\'| \」「上分割會是一個好主意?不知道如何處理雙引號段內的單引號(例如,撇號)。 – joran

+0

@joran :讓我們來看看我的正則表達式是否能夠應對挑戰。我肯定會在另一天離開混合報價問題(混亂?)。 –