-
Notifications
You must be signed in to change notification settings - Fork 237
Description
Hi all,
I have been stumbling into the same issue for a while now, when documenting packages that include S4 methods named like primitives of the base package. I have a kind of workaround (described further below), but I would like to learn if and what is the proper way of dealing with this kind of situation.
The issue is that Roxygen crashes with the following message. As a result, the NAMESPACE file is left with only import* directives, but none of the export* directives.
==> devtools::document(roclets=c('rd', 'collate', 'namespace'))
Updating unisets documentation
Writing NAMESPACE
Loading unisets
Error in (function (cl, name, valueClass) :
assignment of an object of class “call” is not valid for @‘.Data’ in an object of class “MethodDefinition”; is(value, "function") is not TRUE
Calls: suppressPackageStartupMessages ... block_find_object -> object_from_call -> parser -> <Anonymous>
In addition: Warning message:
In asNamespace(ns, base.OK = FALSE) :
operation not allowed on base namespace
Execution halted
Exited with status 1.
This crash happens when I document functions like subset or c like this:
#' @rdname BaseSets-methods
#' @aliases subset.BaseSets subset,BaseSets-method
#'
#' @param ... Additional arguments passed to and from other methods.
#'
#' @section Subsetting:
#'
#' `subset(object, subset, ..., drop=TRUE)` returns subsets of relations which meet conditions.
#' The `subset` argument should be a logical expression referring to any of `"element"`, `"set"`, and any available relation metadata indicating elements or rows to keep: missing values are taken as false.
#' The `drop` logical scalar controls whether elements and sets orphaned during the subsetting should be removed from the `elementData` and `setData` slots, respectively.
#'
#' @importFrom methods as
#' @importFrom BiocGenerics eval unique
#' @importFrom S4Vectors from to subset
#' @method subset BaseSets
#' @export
#'
#' @examples
#'
#' bs1 <- subset(bs, set == "set1" | element == "E")
#' bs1
setMethod("subset", "BaseSets", function(x, ...) {
.local <- function(x, subset, select, drop=TRUE, ...) {
# Match code layout of the FuzzySets method
table <- as.data.frame(x)
i <- eval(substitute(subset), table)
out <- x[i, drop=drop]
# For derived subclasses, coerce back to the original
as(out, class(x))
}
.local(x, ...)
})
I've tried the following too:
> roxygen2::roxygenize()
Loading unisets
Error in (function (cl, name, valueClass) :
assignment of an object of class “call” is not valid for @‘.Data’ in an object of class “MethodDefinition”; is(value, "function") is not TRUE
In addition: Warning message:
In asNamespace(ns, base.OK = FALSE) :
operation not allowed on base namespace
My current workaround is to define both an S3 an S4 functions, and to document the S3 only, like this:
#' @rdname BaseSets-methods
#' @aliases subset.BaseSets subset,BaseSets-method
#'
#' @param ... Additional arguments passed to and from other methods.
#'
#' @section Subsetting:
#'
#' `subset(object, subset, ..., drop=TRUE)` returns subsets of relations which meet conditions.
#' The `subset` argument should be a logical expression referring to any of `"element"`, `"set"`, and any available relation metadata indicating elements or rows to keep: missing values are taken as false.
#' The `drop` logical scalar controls whether elements and sets orphaned during the subsetting should be removed from the `elementData` and `setData` slots, respectively.
#'
#' @importFrom methods as
#' @importFrom BiocGenerics eval unique
#' @importFrom S4Vectors from to subset
#' @method subset BaseSets
#' @export
#'
#' @examples
#'
#' bs1 <- subset(bs, set == "set1" | element == "E")
#' bs1
subset.BaseSets <- function(x, ...) subset(x, ...)
setMethod("subset", "BaseSets", function(x, ...) {
.local <- function(x, subset, select, drop=TRUE, ...) {
# Match code layout of the FuzzySets method
table <- as.data.frame(x)
i <- eval(substitute(subset), table)
out <- x[i, drop=drop]
# For derived subclasses, coerce back to the original
as(out, class(x))
}
.local(x, ...)
})
Can anyone spot what I'm doing wrong?
The package source code is hosted here: https://github.com/kevinrue/unisets if anyone is willing to open a PR showing me the fix.
Thank you in advance!