为什么我的方法 as.character.haven_labelled() 在我的包中不起作用? [r]

问题描述 投票:0回答:1

我试图在我的包中处理

haven_labelled
向量而不导入另一个包来完成它。我已经为它写了一个
as.character
方法,完全供内部使用,所以我不导出它:

# start of haven_generics.R

as.character.haven_labelled <- function(x, ...) {
    as.character.default(x)
}

# end of document

我有一个用于在我的一个嵌入式数据集中进行测试的向量:

> class(mtcars_lab$vs)
[1] "haven_labelled" "vctrs_vctr"     "double" 

但是当我加载包并尝试在我的向量上运行

as.character()
时,R似乎无法找到我的方法并且它调用了下一个类的方法,即
as.character.vctrs_vctr()
,这会产生错误。

> 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))
r r-package
1个回答
0
投票

方法需要通过 Roxygen 导出到命名空间。对于仅限内部和未记录的方法,使用就足够了:

#' @exportS3Method as.character haven_labelled
as.character.haven_labelled <- function(x, ...) {
    as.character.default(x)
}

#' @exportS3Method as.integer haven_labelled
as.integer.haven_labelled <- function(x, ...) {
    as.integer(as.character.haven_labelled(x))
}

我发现使用普通的

@export
有时不会将正确的条目添加到 NAMESPACE,就像它会为
export(as.character.haven_labelled)
创建一个条目而不是为
S3method(as.character,haven_labelled)
创建一个条目。指定
@exportS3Method
是可靠的。

© www.soinside.com 2019 - 2024. All rights reserved.