我试图在我的包中处理有类的向量,而不导入另一个包。我为类haven_labelled
写了一个as.character
方法。它仅供内部使用,所以我不导出它:
as.character.haven_labelled <- function(x, ...) {
as.character.default(x)
}
我在导出的一个数据集中测试了这个向量:
> class(mtcars_lab$vs)
[1] "haven_labelled" "vctrs_vctr" "double"
但是,当我加载包并将向量传递给as.character
时,R分派给as.character.vctrs_vctr
而不是我的方法as.character.haven_labelled
,从而导致错误:
> devtools::load_all(".")
ℹ Loading sift
> as.character(mtcars_lab$vs)
Error in `as.character()`:
! Can't convert `x` <haven_labelled> to <character>.
Run `rlang::last_error()` to see where the error occurred.
> rlang::last_error()
<error/vctrs_error_cast>
Error in `as.character()`:
! Can't convert `x` <haven_labelled> to <character>.
---
Backtrace:
1. base::as.character(mtcars_lab$vs)
2. vctrs:::as.character.vctrs_vctr(mtcars_lab$vs)
Run `rlang::last_trace()` to see the full context.
> rlang::last_trace()
<error/vctrs_error_cast>
Error in `as.character()`:
! Can't convert `x` <haven_labelled> to <character>.
---
Backtrace:
▆
1. ├─base::as.character(mtcars_lab$vs)
2. ├─vctrs:::as.character.vctrs_vctr(mtcars_lab$vs)
3. │ └─vctrs::vec_cast(x, character())
4. └─vctrs (local) `<fn>`()
5. └─vctrs::vec_default_cast(...)
6. ├─base::withRestarts(...)
7. │ └─base (local) withOneRestart(expr, restarts[[1L]])
8. │ └─base (local) doWithOneRestart(return(expr), restart)
9. └─vctrs::stop_incompatible_cast(...)
10. └─vctrs::stop_incompatible_type(...)
11. └─vctrs:::stop_incompatible(...)
12. └─vctrs:::stop_vctrs(...)
13. └─rlang::abort(message, class = c(class, "vctrs_error"), ..., call = vctrs_error_call(call))
1条答案
按热度按时间dsekswqp1#
方法需要通过Roxygen导出到命名空间中,对于内部方法和未记录的方法,使用以下方法就足够了:
我发现使用普通的
@export
有时候并不能向NAMESPACE添加正确的条目,就像它会为export(as.character.haven_labelled)
创建一个条目,但不会为S3method(as.character,haven_labelled)
创建一个条目一样。