用 roxygen2 覆盖 NAMESPACE 和 Rd

Sté*_*ent 4 r rstudio roxygen2

我用 RStudio 创建了一个新包。在“配置构建工具”中,我选中了“使用 Roxygen 生成文档”。

我第一次单击“构建”窗格中的“文档”时,一切正常:

==> roxygen2::roxygenize('.', roclets=c('rd', 'collate', 'namespace'))

First time using roxygen2. Upgrading automatically...
Writing hello.Rd
Writing NAMESPACE
Documentation completed
Run Code Online (Sandbox Code Playgroud)

我得到这个命名空间:

# Generated by roxygen2: do not edit by hand

export(hello)
Run Code Online (Sandbox Code Playgroud)

和这个文件hello.Rd

% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/hello.R
\name{hello}
\alias{hello}
\title{Hello}
\usage{
hello(x)
}
\arguments{
\item{x}{string}
}
\value{
a string
}
Run Code Online (Sandbox Code Playgroud)

但是现在,我修改了文件hello.R,然后我遇到了两个问题。首先会出现这个窗口:

在此处输入图片说明

如果我单击“是”,则没有任何反应。

其次,似乎roxygen2不能覆盖hello.Rd,因为我在“构建”窗格中得到了这个文本:

==> roxygen2::roxygenize('.', roclets=c('rd', 'collate', 'namespace'))

Error: The specified file is not readable: U:\Data\Rtests\testPackage\man/hello.Rd
Execution halted

Exited with status 1.
Run Code Online (Sandbox Code Playgroud)

我发现更新文档的唯一方法是运行:

roxygen2::roxygenize(clean=TRUE)
Run Code Online (Sandbox Code Playgroud)

此命令首先清除所有内容、NAMESPACE 和Rd文件,然后生成 NAMESPACE 和Rd文件。

不知道是不是路径的问题Rtools。我尝试通过执行以下操作来设置路径:

Sys.setenv(PATH="%PATH%;C:/Program Files/Rtools/gcc-4.6.3/bin;C:/Program Files/Rtools/gcc-4.6.3/bin64;C:/Program Files/Rtools/gcc-4.6.3/i686-w64-mingw32/bin;C:/Program Files/Rtools/bin")
Run Code Online (Sandbox Code Playgroud)

但这并不能解决问题。

我正在使用:

  • roxygen2 5.0.1

  • RStudio 0.99.892

  • Windows 7的

  • R version 3.3.1

Sté*_*ent 8

问题的原因。

roxygen2包依赖于digest包。错误(The specified file is not readable)是包的digest函数产生的digest,在这个函数调用file.access函数的时候:https : //github.com/eddelbuettel/digest/blob/master/R/digest.R #L102

我得到:

> file.access("U:/Data", 4)
U:/Data 
     -1 
Run Code Online (Sandbox Code Playgroud)

这意味着U:/Data没有读取权限。但事实并非如此:它具有读取权限。问题是我的U:驱动器是“网络驱动器”,并且file.access网络驱动器的功能存在一些问题,例如我们可以在这里看到:https : //github.com/eddelbuettel/digest/issues/13

解决方法

如果R.utils::fileAccess将其用于代替函数中file.access,则问题将得到解决digest::digest

所以,首先取digest::digest函数的代码,修改如下。

mydigest <- function (object, algo = c("md5", "sha1", "crc32", "sha256", 
    "sha512", "xxhash32", "xxhash64", "murmur32"), serialize = TRUE, 
    file = FALSE, length = Inf, skip = "auto", ascii = FALSE, 
    raw = FALSE, seed = 0, errormode = c("stop", "warn", "silent")) 
{
  file.access <- R.utils::fileAccess
  .... the code of the digest function here ...
}
Run Code Online (Sandbox Code Playgroud)

然后做:

library(digest)
R.utils::reassignInPackage("digest", "digest", mydigest)
Run Code Online (Sandbox Code Playgroud)

现在可以通过执行以下操作来更新文档:

roxygen2::roxygenize()
Run Code Online (Sandbox Code Playgroud)