【问题标题】:Function runs from R console, but fails when built into package功能从 R 控制台运行,但内置到包中时失败
【发布时间】:2016-03-03 23:24:06
【问题描述】:

我有一个功能在直接从 R 控制台运行时可以完美运行。但是,当我构建和加载包含完全相同函数的包时,调用它时会引发错误。

#' Create divided difference matrix
#' @param x vector to process
#' @param d Dimension
#' @export
#' @return Output is divided difference matrix for use internally in regSmooth
divided.diff <- function (x, d){
  m  <- length(x)
  if (d == 0) {
    D <- Matrix::sparseMatrix(1:m,  1:m,  x  =  1,  dims  =  c(m,m))}
  else {
    dx  <-  x[(d + 1):m] - x[1:(m - d)]
    dl <- length(dx)
    V <- Matrix::sparseMatrix(1:dl,  1:dl,  x  =  1/dx,  dims  =  c(dl,dl))
    D  <-  d * V %*% diff(divided.diff(x, d - 1))}
  return (D)
}

示例:将上述函数定义剪切并粘贴到R控制台中,然后运行

divided.diff(1:5,2)

输出(如预期)是

“dgCMatrix”类的 3 x 5 稀疏矩阵

[1,] 1 -2 1 。 .
[2,] 。 1 -2 1。
[3,]。 . 1 -2 1

但如果我使用 RStudio 构建包含此功能的包,则安装并加载该包。然后运行相同的命令

divided.diff(1:5,2)

产生错误

r[i1] 中的错误:“S4”类型的对象不是子集

追溯是:

5 diff.default(divided.diff(x, d - 1))
regSmooth1.0.R#14 处的 4 diff(divided.diff(x, d - 1))
3 除数.diff(x, d - 1)
regSmooth1.0.R#14 处的 2 diff(divided.diff(x, d - 1))
1分.diff(1:5, 2)

我不知道为什么这个函数会根据它是否在一个包中而表现不同。它似乎与构建创建 S4 类对象的包有关,但除此之外我迷路了。对此行为的任何解释以及有关如何使其工作的指示都非常感激。

更新:DESCRIPTION文件(删除联系方式)如下

Package: regSmooth
Title: Data Smoothing by Regularization
Version: 1.0
Date: 2016-02-14
Author: xxx
Authors@R: person("xx", "xx", email = "zz", role = c("aut", "cre"))
Maintainer: xx  <xx@xx.edu>
Description: This package provides functions to perform smoothing by  
Tikhonov regularization. Automated optimization of the regularization
parameter can optionally be conducted by cross-validation.
Depends: R (>= 3.1.1)
Imports: Matrix
License: GPL-2
RoxygenNote: 5.0.1

NAMESPACE 文件是:

# Generated by roxygen2: do not edit by hand

export(divided.diff)
export(regSmooth)
export(regSmoothAuto)

【问题讨论】:

  • 你的包是否在DESCRIPTION文件中声明了对Matrix包的依赖?
  • 确实如此。我将编辑问题以添加DESCRIPTION和NAMESPACE文件内容
  • 如果您library(Matrix); methods("diff"),您会看到为Matrix 对象定义了一个S4 diff 方法。您可能需要(以某种方式)将其导入您的包命名空间...

标签: r package s4


【解决方案1】:

感谢 Ben Bolker 的评论引导我找到答案。 Matrix 包为其类创建了 S4 版本的 diff 方法。即使导入了 Matrix 包,我们也需要明确指示函数使用 S4 版本的 diff,而不是通用版本。

添加

#' @importMethodsFrom Matrix diff

到函数序言,然后运行 ​​Roxygen2 在 NAMESPACE 中生成以下行。

importMethodsFrom(Matrix,diff)

这解决了问题。

【讨论】:

    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多