【发布时间】: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对象定义了一个S4diff方法。您可能需要(以某种方式)将其导入您的包命名空间...