函数从R控制台运行,但在内置到包

时间:2016-03-03 23:24:06

标签: r package s4

我有一个直接从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)

输出(如预期的那样)是

  

3 x 5稀疏矩阵类“dgCMatrix”
  
  [1,] 1 -2 1。 。
  [2,]。 1 -2 1。
  [3,]。 。 1 -2 1

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

divided.diff(1:5,2)

生成错误

  

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

回溯是:

  

5 diff.default(divide.diff(x,d - 1))
  4个diff(divide.diff(x,d - 1))at regSmooth1.0.R#14
  3 divide.diff(x,d - 1)
  2差异(divide.diff(x,d - 1))at regSmooth1.0.R#14
  1 divide.diff(1:5,2)

我不知道为什么这个函数的行为会有所不同,这取决于它是否在包中。它似乎与构建创建S4类对象的包有关,但除此之外,我迷失了。对这种行为的任何解释以及关于如何使其工作的指示感激不尽。

更新:描述文件(编辑以删除联系人详细信息)如下

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)

1 个答案:

答案 0 :(得分:2)

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

添加

#' @importMethodsFrom Matrix diff

到函数前导码,然后运行Roxygen2在NAMESPACE中生成以下行。

importMethodsFrom(Matrix,diff)

解决了这个问题。