我有一个包,其中包含一个从fread调用 data.table 的函数。 data.table在其DESCRIPTION文件的“建议”字段中具有bit64包,这使fread能够将大整数导入为integer64而不是numeric。默认情况下,我的包装中需要此功能。

这是R 3.1.3下的可重现示例(早期版本没有此问题)。

尝试1

Vectorize(dir.create)(c("test", "test/R", "test/man"))

cat(
  "Package: test
Title: Test pkg
Description: Investigate how to use suggested package
Version: 0.0-1
Date: 2015-03-10
Author: Richie Cotton
Maintainer: Richie Cotton <[email protected]>
Imports: data.table
Suggests: bit64
License: Unlimited
",
  file = "test/DESCRIPTION"
)

cat(
  "#' Read data
#'
#' Wrapper to \\code{fread} that loads bit64 first
#' @param ... Passed to fread.
#' @return A data frame of uniformly distributed random numbers and their index.
#' @importFrom data.table fread
#' @export
read_data <- function(...)
{
  library(bit64)
  fread(...)
}",
  file = "test/R/read_data.R"
)

当我运行R CMD check时,
library(roxygen2)
library(devtools)
roxygenize("test")
check("test")

我得到以下NOTE:
* checking dependencies in R code ... NOTE
'library' or 'require' call to 'bit64' in package code.
Please use :: or requireNamespace() instead.
See section 'Suggested packages' in the 'Writing R Extensions' manual.

尝试2

documentation建议将library替换为 requireNamespace 。这将检查包是否存在,但不会将其加载到R的搜索路径中。

如果我将read_data的定义更新为:
read_data <- function(...)
{
  if(!requireNamespace('bit64'))
  {
    warning('bit64 not available.')
  }
  fread(...)
}

那么R CMD check会平稳运行,但是由于bit64现在未加载,因此fread无法读取长整数。

尝试3

如果我更改DESCRIPTION以便bit64Depends部分中(而不是Suggests,并像尝试2一样保留read_data,或者简化为
read_data <- function(...)
{
  fread(...)
}

然后R CMD check给出NOTE:
* checking dependencies in R code ... NOTE
Package in Depends field not imported from: 'bit64'
  These packages need to be imported from (in the NAMESPACE file)
  for when this namespace is loaded but not attached.

我不太确定在这种情况下应该导入什么内容。

尝试4

如果我将bit64保留在Depends部分中,并使用read_data的原始定义,
read_data <- function(...)
{
  library(bit64)
  fread(...)
}

然后R CMD check给出NOTE:
* checking dependencies in R code ... NOTE
'library' or 'require' call to 'bit64' which was already attached by Depends.
Please remove these calls from your code.
Package in Depends field not imported from: 'bit64'

我觉得应该将DESCRIPTION和函数定义进行某种神奇的组合,从而为我提供bit64功能并清晰地传递R CMD check;我只是看不到我错过了什么。

我怎样才能做到这一点?

最佳答案

尝试3最近。在roxygen文档中,我只需要一个额外的@import bit64

Vectorize(dir.create)(c("test", "test/R", "test/man"))

cat(
  "Package: test
Title: Test pkg
Description: Investigate how to use suggested package
Version: 0.0-1
Date: 2015-03-10
Author: Richie Cotton
Maintainer: Richie Cotton <[email protected]>
Depends: bit64
Imports: data.table
License: Unlimited
",
  file = "test/DESCRIPTION"
)

cat(
  "#' Read data
#'
#' Wrapper to \\code{fread} that loads bit64 first
#' @param ... Passed to fread.
#' @return A data frame of uniformly distributed random numbers and their index.
#' @import bit64
#' @importFrom data.table fread
#' @export
read_data <- function(...)
{
  fread(...)
}",
  file = "test/R/read_data.R"
)

10-07 22:19