我有一个直接从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)
答案 0 :(得分:2)
感谢Ben Bolker的评论让我得到答案。矩阵包为其类创建了一个S4版本的diff方法。即使导入了Matrix包,我们也需要明确指示函数使用diff版本的S4版本,而不是通用版本。
添加
#' @importMethodsFrom Matrix diff
到函数前导码,然后运行Roxygen2在NAMESPACE中生成以下行。
importMethodsFrom(Matrix,diff)
解决了这个问题。