gpt4 book ai didi

r - 定义运算符不再起作用(UseMethod ("%op%"中的错误): no applicable method for '%op%' applied to an object of class "character")

转载 作者:行者123 更新时间:2023-12-03 16:32:31 26 4
gpt4 key购买 nike

在我的玩具包中,我定义了 %+%运算符作为 paste0() 的别名.试图减少与其他包的干扰,我通过以下方式实现:

`%+%` <- function(...) UseMethod("%+%")

`%+%.character` <- paste0

`%+%.numeric` <- paste0

`%+%.default` <- function (arg1, arg2){
e <- parent.env(getEnvByName(.GlobalEnv,'package:mypackagename'));
if (exists('%+%', envir = e)) get('%+%',envir = e)(arg1,arg2);
}
即我只为 character 覆盖它和 numeric参数,否则它会尝试查找该方法是否先前已定义。
它一直工作得很好,直到最近它开始出现错误:
'a' %+% 'b'
# Error in UseMethod("%+%") :
# no applicable method for '%+%' applied to an object of class "character"
只有在包外调用时才会失败。如果我在包中定义一个函数,它可以正常工作:
# testab2() is defined in R file as a part of the package:
testab2 <- function(inpA, inpB){
print (inpA %+% inpB)
}


# when called outside of the package:
testab2('a','b')
# ab
我很确定我没有更改我的代码中的任何内容,所以我想知道它是否可能是由 R 更新引起的。什么可以改变以及如何使它恢复正常工作?
附言 getEnvByName()是我在父环境中搜索对象的辅助函数:
getEnvByName <- function(inpEnv=.GlobalEnv, lookFor){
e <- inpEnv;
while (environmentName(e) != 'R_EmptyEnv' & environmentName(e)!=lookFor) e <- parent.env(e);
if (environmentName(e) != lookFor) return(NULL);
return(e);
}
导出是通过 NAMESPACE 中的以下几行完成的文件:
exportPattern("^[[:alpha:]]+")
exportPattern("%.*%")
export("%+%.default")
export("%+%.character")
P.P.S. session 信息:
R version 4.0.2 (2020-06-22)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252
system code page: 1251

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] vautils_0.1.1.105 magrittr_1.5 data.table_1.13.0

loaded via a namespace (and not attached):
[1] dplyr_1.0.2 crayon_1.3.4 grid_4.0.2 R6_2.4.1 lifecycle_0.2.0 gtable_0.3.0
[7] scales_1.1.1 ggplot2_3.3.2 pillar_1.4.6 rlang_0.4.7 rstudioapi_0.11 generics_0.0.2
[13] vctrs_0.3.4 ellipsis_0.3.1 tools_4.0.2 glue_1.4.2 purrr_0.3.4 munsell_0.5.0
[19] compiler_4.0.2 pkgconfig_2.0.3 colorspace_1.4-1 tidyselect_1.1.0 tibble_3.0.3

最佳答案

要导出 S3 方法,您的 NAMESPACE文件需要(在您的情况下)包含以下声明:

export(`%+%`)
S3method(`%+%`, default)
S3method(`%+%`, character)
S3method(`%+%`, numeric)
即导出 %+%通用和 declare S3 methods for the methods .
更好的是,而不是手动编辑 NAMESPACE文件使用‘roxygen2’,它会为您生成正确的声明 based on the @export documentation tag .

关于r - 定义运算符不再起作用(UseMethod ("%op%"中的错误): no applicable method for '%op%' applied to an object of class "character"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64169392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com