Обтекание строк, но не подстрок в кавычках, используя R - PullRequest
5 голосов
/ 10 сентября 2011

Этот вопрос связан с моим вопросом о 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.Я определил, где этот патч должен быть применен, и признаю ваш вклад.

1 Ответ

2 голосов
/ 10 сентября 2011

Вот что я сделал, чтобы получить 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, "\'|\"") в качестве критерия разделения в приведенном выше коде. 1008 *

...