Подтвердить что ты не робот

Roxygen: как установить параметр по умолчанию, включая обратную косую черту ('\') для функций

Я использую Roxygen для генерации Rd файлов моих пакетов в процессе разработки, но у меня есть некоторые проблемы с функциями с параметром по умолчанию, установленным на '\n', например:

  lineCount <- function(text, sep='\n') {
       ...
   }

Какая цель состоит в подсчете новых строк ('\n') символов в строке. Проблема в том, что проверка R CMD дает предупреждение о:

Codoc mismatches from documentation object 'lineCount':
lineCount
  Code: function(text, sep = "\n")
  Docs: function(text, sep = " ")
  Mismatches in argument default values:
    Name: 'sep' Code: "\n" Docs: " "

Мне кажется, что проблема связана с записью в Rd файл (для записи в стандартные файлы LaTeX через cat() всегда требуется удвоить escape-символы для какой-либо цели, например: \\newline - как я и испытал). Если я поставлю дополнительную обратную косую черту в разделитель, например:

  lineCount <- function(text, sep='\\n') {
       ...
   }

Проблема все еще возникает, как и в коде, она выглядит как '\\n', но в документах (файлы Rd) она выглядит '\n'.

Есть ли легкое решение для моей проблемы? Может быть, дополнительный тег в Roxygen, который может определить, как записать параметры функции в файл Rd? Извините, если у вас слишком явный вопрос, но я потерял его после Google-времени.


История: http://permalink.gmane.org/gmane.comp.lang.r.roxygen/24


UPDATE: используйте roxygen2!

4b9b3361

Ответ 1

Я также столкнулся с проблемами со слишком большим количеством экранированных "и исчезающих \t. В итоге я изменил функцию parse.formals в roxygen Rd2.R следующим образом:

  parse.formals <- function(partitum) {
    formals <- partitum$formals
    if (!is.null(formals)) {
      formals <- lapply(formals, trim)
      formals <- lapply(formals, paste, collapse=" ")
      name.defaults <- zip.c(names(formals), formals)
      args <-
        do.call(paste, c(Map(function(name.default) {
          name <- car(name.default)
          default <- cadr(name.default)
          if (! is.character (default)) {  # too much escaped. 
                                           # Not sure when escaping is needed. 
                                           # param = c ("x", "y", "z") works now
            default <- gsubfn("\"(.*)\"",
                              function(x)
                              sprintf("\"%s\"", gsub("\"", "\\\\\"", x)),
                              as.character(default))
          }
          default <- gsub ("\t", "\\\\t", default) # the tabs and newlines are already
          default <- gsub ("\n", "\\\\n", default) # tab and newline here.
          if (is.null.string(default))
            name
          else
            sprintf('%s=%s', name, default)
        },
                             name.defaults),
                         sep=', '))

      append.Rd(usageTag(parse.function.name(partitum), args))
    }
  }

Надеюсь, что это поможет и ничего не сломает.

Ответ 2

Я столкнулся с этой проблемой, т.е. у меня был split = "\ +" и split = "\ |" в различных функциях.

Файлы .Rd на самом деле также представляют их как split = "\ +" и split = "\ |", но тогда все, что читает .Rd файлы в R CMD check, превратило их в split = "+" и split = "\ |" и вызвала ошибку.

Если файлы .Rd имеют split = "\\ +" и split = "\\ |" он будет правильно прочитан.

Мое решение состояло в том, чтобы запустить это в каталоге/man/с файлами .Rd непосредственно перед проверкой CM CMD:

perl -e 's/( "\\\ |" )/ "\\\\\ | \" /g;' -pi $(найти BioGeoBEARS/man-тип f)

perl -e 's/( "\\ +" )/ "\\\\ +" /g;' -pi $(найти BioGeoBEARS/man-тип f)

Взял немного проб и ошибок, но он работает!

Ура! Ник

Ответ 3

У меня была та же проблема. Я закончил переопределять поле использования по умолчанию, которое было создано roxygen из исходного кода с помощью @usage. Например. исходный файл R содержит

#' @usage sourceall(dir = getwd(), pattern = ".*\\\\.R", ...)
sourceall <- function( dir=getwd(), pattern=".*\\.R", ... )
{
    blah blah
}

Ответ 4

У меня возникла аналогичная проблема с roxygen2 v6.0.1.

# this caused errors in R CMD check (non-ASCII chars)
f <- function(x, y, chr = "\u279B")

# this was ok
f <- function(x, y, chr = intToUtf8(0x279B))

В вашем случае, с символом новой строки, он также должен работать:

lineCount <- function(text, sep = intToUtf8(10))

Ответ 5

Ну, frack me, в поле комментариев скрываются символы обратной косой черты! Я отказываюсь добавить к безумию и добавить обратную косую черту, чтобы избежать черных пятен в коде perl, которые избегают обратных косых черт в файлах .Rd, которые выходят из зазоров в R.

Просто удвоить все обратные косые черты.

Или теги кода hmm:

perl -e 's/("\\\\\|")/"\\\\\\\\\|"/g;' -pi $(find BioGeoBEARS/man -type f)

perl -e 's/("\\\\\+")/"\\\\\\\\\+"/g;' -pi $(find BioGeoBEARS/man -type f)

Да, это хорошо.