实际问题

我怎样才能避免\\dontrun{在包含示例的单独文件中变为\\\\dontrun{在roxygen化后的相应Rd文件中?

我找到了一个解决方法,但感觉好像我可能只是遗漏了一些明显的东西,即roxigenize()一些设置。

细节

我想我注意到一个可能的错误,或者,恕我直言,至少在处理使用roxygen2的示例时存在于一个单独的文件中的不良行为(而不是在实际的roxygen代码中说明它)。

问题是,在roxygenizing之后,各个示例文件中的行\\dontrun{变为\\\\dontrun{在生成的Rd文件中。

您可以在下面找到行为的说明以及简单的解决方法

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 \\dontrun{ in ./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
> 

#1楼 票数:3

这是在最新版本的roxygen2中修复的错误。

#2楼 票数:2

在这个分支中实现了一个(更简单的) 临时修复https//github.com/jeroenooms/roxygen/tree/patch_dontrun

请参阅提交更改。 它是一个单线修复。 我也向彼得发送了拉动请求,希望它能在主包中被采用。

  ask by Rappster translate from so

未解决问题?本站智能推荐:

1回复

使用Roxygen2模板标签

有人可以举例说明如何在Roxygen2正确使用模板标签。 我试图做最明显的事情(对我来说): 在我的packageName-package.R文件中: 然后在someFunction.R文件中 我收到错误: 我试图有一个地方来记录通常重复的定义示例等。当这些东西嵌
1回复

使用带有roxygen2的@符号[重复]

可能重复: 在Roxygen2样式文档中转义“@” 如何在roxygen文档中使用@,如: 当你运行roxygenize并且没有把@放在.Rd文件中时,这会发出警告。
3回复

roxygen2 和 RStudio,不为函数创建文档

我正在尝试通过 roxygen2 在包中添加文档。 我能够成功创建包,并且在加载时也可以使用这些功能。 这是我对如何做的理解,我在 RStudio 上创建了一个空的 R-Package 项目,然后有一个名为“getSomething.R”的源文件。 内容如下, 现在,我构建并加载理想情况下应该使
2回复

使用 Roxygen2 记录 R6 类方法

我正在编写一个带有多个方法的 R6 类的包。 我希望能够为类和方法生成文档。 对于下面的示例,我希望能够使用?Person访问该类的文档,并使用?set_hair访问该方法的文档。 这是我的示例类: 运行roxygenise() ,方法主体上方的注释根本没有呈现,所以我在@section Met
1回复

Roxygen2 - 如何@export引用类生成器?

例如,假设我有以下名为Test包,我想导出A类: 但是,在构建和加载后,使用A的生成器时出现以下错误: 我已经检查了我的NAMESPACE文件的内容很好: 出了什么问题? 为什么不导出我的类生成器?
1回复

在roxygen2中添加度数符号

如何使用roxygen2为R文档添加度数符号? °C以pdf格式工作,但以html格式显示,以°C 。 这是会话信息。
1回复

roxygen2不生成.rd文件

当我尝试在RStudio中使用roxygen2 :: roxygenize()时,出现错误消息。 我遇到的消息是这样的: 警告消息:roxygen2未生成trainModel.Rd。 跳过。 我已经做了很多尝试来解决此问题,但是除非我删除所有#'注释(否则就不会使用roxy
2回复

roxygen2“错误:title需要一个值”

我收到了roxygenize()的错误,我无法理解。 我有一个我的杂项函数包,其中.Rd文件是通过roxygen生成的。 错误是Error: titlerequires a value ,这表明没有@title标记。 但是kmmisc-package.R文件中有一个@title标签,所