Обработка файлов примеров с помощью roxygen2: дублируются обратные косые черты (\dontrun становится \\dontrun)

Актуальный вопрос

Как я могу избежать того, что \dontrun{ в отдельном файле, содержащем примеры, станет \\dontrun{ в соответствующем файле Rd после roxygenizing?

Я нашел обходной путь, но мне кажется, что я просто упускаю что-то очевидное, то есть какую-то настройку roxigenize().

Подробности

Кажется, я заметил возможную ошибку или, ИМХО, как минимум нежелательное поведение при обработке примеров с помощью roxygen2, которые хранятся в отдельном файле (вместо того, чтобы указать это прямо в самом коде roxygen).

Проблема в том, что строка \dontrun{ в соответствующих файлах примеров становится \\dontrun{ в результирующем файле Rd после roxygenizing.

Ниже вы найдете иллюстрацию поведения вместе с простым обходным путем.

1) Убедитесь, что каталоги

dir.create("src", recursive=TRUE, showWarnings=FALSE)
dir.create("package", recursive=TRUE, showWarnings=FALSE)

# Ensure empty package directory
subdirs <- list.files("package", full.names=TRUE)
if (length(subdirs)) {
    sapply(subdirs, unlink, recursive=TRUE)
}

2) Создайте примеры функций с двумя разными способами встраивания примеров.

foo1 <- function(x) {message("I'm foo #1"); return(TRUE)}
roxy.1 <- c(
    "#' Title foo1()",
    "#'", 
    "#' Description foo1().",
    "##' This line is commented out",
    "#'", 
    "#' @param x Some R object that doesn't matter.",
    "#' @return \\code{TRUE}.",
    "#' @references \\url{http://www.something.com/}",
    "#' @author John Doe \\email{john.doe@@something.com}",
    "#' @seealso \\code{\\link{foo2}}",
    "#' @example inst/examples/foo1.R"
)
ex.1 <- c(
    "\\dontrun{",
    "foo1()",
    "}"
)

foo2 <- function(y) {message("I'm foo #2"); return(FALSE)}
roxy.2 <- c(
    "#' Title foo2()",
    "#'", 
    "#' Description foo2().",
    "##' This line is commented out",
    "#'", 
    "#' @param y Some R object that doesn't matter.",
    "#' @return \\code{FALSE}.",
    "#' @references \\url{http://www.something.com/}",
    "#' @author John Doe \\email{john.doe@@something.com}",
    "#' @seealso \\code{\\link{foo1}}",
    "#' @examples", 
    "#' \\dontrun{",
    "#' foo2()}",
    "#' }"
)

write(roxy.1, file="src/foo1.R")
write(c("foo1 <-", deparse(foo1)), file="src/foo1.R", append=TRUE)
write(roxy.2, file="src/foo2.R")
write(c("foo2 <-", deparse(foo2)), file="src/foo2.R", append=TRUE)

3) Создать скелет пакета

package.skeleton(name="test", path="package", 
    code_files=c("src/foo1.R", "src/foo2.R"))

4) Создайте отдельный файл примера для foo1()

dir.create("package/test/inst/examples", recursive=TRUE, showWarnings=FALSE)
write(ex.1, file="package/test/inst/examples/foo1.R")

5) Роксигенизация

require("roxygen2")
roxygenize(
    package.dir="package/test",
    overwrite=TRUE, 
    unlink.target=FALSE,
    roclets = c("collate", "namespace", "rd")
)

6) Проверить пакет

shell("R CMD check package/test", intern=FALSE)

Усеченный вывод проверки R CMD, который показывает, что есть проблема с \dontrun{ в ./package/test/man/foo1.Rd

[...]
Warning: parse error in file 'test-Ex.R':
1: unexpected input
19: 
20: \
    ^
* checking examples ... ERROR
Running examples in 'test-Ex.R' failed
The error most likely occurred in:

> ### Name: foo1
> ### Title: Title foo1()
> ### Aliases: foo1
> 
> ### ** Examples
> 
> \dontrun{
Error: unexpected input in "\"
Execution halted
Warning message:
In shell(expr, intern = FALSE) :
  'R CMD check package/test' execution failed with error code 1
> 

7) Обходной путь

patchRdFiles <- function( 
    path="package",
    name,
    ...
) {
    path <- file.path(path, name, "man")
    if (!file.exists(path)) {
        stop(paste("Invalid directory path: '", path, "'", sep=""))
    }
    files <- list.files(path, full.names=TRUE)  
#ii=files[1]    
    .dead <- sapply(files, function(ii) {
        cnt <- readLines(ii, warn=FALSE)
        if (length(grep("\\\\\\\\dontrun", cnt, perl=TRUE))) {
            message(paste("Correcting: '", ii, "'", sep=""))
            write(gsub("\\\\dontrun", "\\dontrun", cnt), file=ii)
        }
        return(NULL)
    })
    return(TRUE)
}

Это удалит все повторяющиеся обратные косые черты в файлах Rd:

patchRdFiles(name="test")

8) Снова проверка пакета

# CHECK PACKAGE AGAIN
path <- "package/test"
expr <- paste("R CMD check", path)
shell(expr, intern=FALSE)

Снова усеченный вывод проверки R CMD. Рассматриваемый файл Rd теперь прошел проверку. Текущая ошибка вызвана неполным ./package/test/man/test-package.Rd, что на данный момент нормально.

[...]
Warning: parse error in file 'test-Ex.R':
11: unexpected symbol
56: 
57: ~~ simple examples
              ^
* checking examples ... ERROR
Running examples in 'test-Ex.R' failed
The error most likely occurred in:

> ### Name: test-package
> ### Title: What the package does (short line) ~~ package title ~~
> ### Aliases: test-package test
> ### Keywords: package
> 
> ### ** Examples
> 
> ~~ simple examples of the most important functions ~~
Error: unexpected symbol in "~~ simple examples"
Execution halted
Warning message:
In shell(expr, intern = FALSE) :
  'R CMD check package/test' execution failed with error code 1
> 

person Rappster    schedule 17.09.2012    source источник
comment
Если ответ не найден, вы должны сообщить о проблеме разработчику (https://github.com/klutometis/roxygen/issues). Некоторое время назад у меня была проблема с игнорированием отступов в примерах roxygen2, и они исправили ее в следующей версии.   -  person Backlin    schedule 17.09.2012
comment
Отлично, спасибо за указатель. Я отправил ссылку на этот пост Хэдли по электронной почте, но регистрация стандартизированной проблемы действительно может быть лучшим способом.   -  person Rappster    schedule 17.09.2012
comment
Дал ли вам протестировать github.com/hadley/roxygen3?. Редактировать: ну, это оказался довольно старый вопрос, ошибка, вероятно, уже исправлена...   -  person Jouni Helske    schedule 04.03.2013
comment
В foo2.R есть синтаксическая ошибка: в разделе примеров 2 закрывающие скобки.   -  person GSee    schedule 02.04.2013
comment
@GSee: спасибо, посмотрю   -  person Rappster    schedule 03.04.2013


Ответы (2)


Это ошибка, исправленная в последних версиях roxygen2.

person hadley    schedule 23.03.2014
comment
какой символ новой строки в roxygen2? - person Mona Jalal; 02.05.2014

В этой ветке реализовано (более простое) временное исправление: https://github.com/jeroenooms/roxygen/tree/patch_dontrun.

См. коммит, чтобы узнать об изменении. Это однострочное исправление. Я также отправил Питеру запрос на вытягивание, так что, надеюсь, он будет принят в основном пакете.

person Jeroen    schedule 01.04.2013
comment
+1. Поскольку это всего лишь однострочное исправление, почему бы не скопировать и не вставить его сюда, чтобы другим не приходилось просматривать коммиты? - person GSee; 02.04.2013