R软件包和S4对象:“;找不到继承的方法";错误
我正在编写我的第一个R包,并且正在为S4中的继承和方法定义而挣扎。我使用的是标准的包组织(R软件包和S4对象:“;找不到继承的方法";错误,r,oop,s4,R,Oop,S4,我正在编写我的第一个R包,并且正在为S4中的继承和方法定义而挣扎。我使用的是标准的包组织(usethis::create\u package()) 我在文件R/set class.R中定义了这个类: #' @title The Set class #' @slot ris A 2-column character dataframe #' @slot tfs A character vector of TF names #' @import dplyr #' @export setClass(
usethis::create\u package()
)
我在文件R/set class.R
中定义了这个类:
#' @title The Set class
#' @slot ris A 2-column character dataframe
#' @slot tfs A character vector of TF names
#' @import dplyr
#' @export
setClass(
"set",
slots = list(
ris = "data.frame",
tfs = "character"
)
)
#' @title Constructor function of a set object.
#' @description Constructor function of a set object.
#' @param ris A 2-column character dataframe of TF-gene interactions.
#' @param tfs A character vector of TF names.
#' @return A `set` object.
#' @export
set <- function(ris, tfs) {
new("set", ris = ris, tfs = tfs)
}
#' @name get_tfs
#' @aliases get_tf,set-method
#' @param x A `set` object
#' @docType methods
#' @rdname set-methods
#' @return A character vector
setGeneric("get_tfs",
valueClass = "character",
function(x){
standardGeneric("get_tfs")
}
)
setMethod(
"get_tfs",
signature(x = "set"),
function(x) {
x@tfs
}
)
现在,我构建一个“set”对象并尝试使用以下方法:
> test <- set(ris, tfs)
> is(test)
[1] "set"
> get_tfs(test)
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘get_tfs’ for signature ‘"set"’
完整的代码可用免责声明:这不是一个完整的解决方案,但可能帮助您解决问题,不适合作为评论
所以,你链接到的GitHub回购非常复杂,我无法让它工作。因此,我所做的是启动一个没有任何内容的新包,然后将代码添加到单个R文件R/set.R
当我尝试记录和构建时,它不喜欢这样,因为set方法
没有标题。我还注意到没有@export
标签。因此,我在完整文件中添加了以下两个内容:
#' @title The Set class
#' @slot ris A 2-column character dataframe
#' @slot tfs A character vector of TF names
#' @import dplyr
#' @export
setClass(
"set",
slots = list(
ris = "data.frame",
tfs = "character"
)
)
#' @title Constructor function of a set object.
#' @description Constructor function of a set object.
#' @param ris A 2-column character dataframe of TF-gene interactions.
#' @param tfs A character vector of TF names.
#' @return A `set` object.
#' @export
set <- function(ris, tfs) {
new("set", ris = ris, tfs = tfs)
}
#' @title Placeholder title.
#' @name get_tfs
#' @aliases get_tf,set-method
#' @param x A `set` object
#' @docType methods
#' @rdname set-methods
#' @return A character vector
#' @export
setGeneric("get_tfs",
valueClass = "character",
function(x){
standardGeneric("get_tfs")
}
)
setMethod(
"get_tfs",
signature(x = "set"),
function(x) {
x@tfs
}
)
#@title集合类
#“@slot”是一个2列字符的数据帧
#“@slot tfs TF名称的字符向量
#“@import dplyr”
#“@出口
setClass(
“设置”,
插槽=列表(
ris=“data.frame”,
tfs=“字符”
)
)
#“@title构造函数是一个集合对象的函数。
#'@description集合对象的构造函数。
#@param-ris是TF基因相互作用的两列字符数据框。
#“@param tfs TF名称的字符向量。
#“@返回一个`set`对象。
#“@出口
设置为这样,我们需要一些信息来诊断这个问题,但没有。您的命名空间是什么样子的?在哪里定义了set()
?您采取了哪些步骤来构建和安装该软件包?等等。FWIW,在包的上下文之外运行代码对我来说很好(除了将set(…)
更改为new(“set”),…)
Hi,经过一番努力,我似乎找到了问题的根源:在我的库中,我定义了另一类对象,而另一类有一个同名的方法“get\tfs”,当我对它进行评论时,问题就消失了。所以现在我重命名了其中一个方法。但是我觉得R应该能够根据输入的类应用这两个方法中的任何一个?也许我仍然缺少一些约定。
#' @title The Set class
#' @slot ris A 2-column character dataframe
#' @slot tfs A character vector of TF names
#' @import dplyr
#' @export
setClass(
"set",
slots = list(
ris = "data.frame",
tfs = "character"
)
)
#' @title Constructor function of a set object.
#' @description Constructor function of a set object.
#' @param ris A 2-column character dataframe of TF-gene interactions.
#' @param tfs A character vector of TF names.
#' @return A `set` object.
#' @export
set <- function(ris, tfs) {
new("set", ris = ris, tfs = tfs)
}
#' @title Placeholder title.
#' @name get_tfs
#' @aliases get_tf,set-method
#' @param x A `set` object
#' @docType methods
#' @rdname set-methods
#' @return A character vector
#' @export
setGeneric("get_tfs",
valueClass = "character",
function(x){
standardGeneric("get_tfs")
}
)
setMethod(
"get_tfs",
signature(x = "set"),
function(x) {
x@tfs
}
)
library(set)
ris <- data.frame(1)
tfs <- "a"
test <- set(ris, tfs)
is(test)
# [1] "set"
get_tfs(test)
# [1] "a"