1

我正在尝试重现一个补充示例 2 Continuous response: a dose-response curve from the drc package

尝试运行时 coeftest(ryegrass.LL.4, vcov = sandwich),出现以下错误:

Error in UseMethod("estfun") : 
 no applicable method for 'estfun' applied to an object of class "drc".

我试图用谷歌搜索错误但没有成功并使用vcov.代替vcov(因为 vcov. 在 R 中自动建议,但文章使用 vcov)但仍然得到相同的错误。

任何想法如何解决这个问题?

会话信息:

R version 4.0.3 (2020-10-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19041)

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

other attached packages:
[1] lmtest_0.9-38  zoo_1.8-8      sandwich_3.0-0 drc_3.0-1      MASS_7.3-53   

loaded via a namespace (and not attached):
 [1] zip_2.1.1         Rcpp_1.0.5        pillar_1.4.7      compiler_4.0.3    cellranger_1.1.0 
 [6] forcats_0.5.0     tools_4.0.3       lifecycle_0.2.0   tibble_3.0.4      lattice_0.20-41  
[11] pkgconfig_2.0.3   rlang_0.4.8       Matrix_1.2-18     openxlsx_4.2.3    rstudioapi_0.13  
[16] curl_4.3          mvtnorm_1.1-1     haven_2.3.1       xfun_0.18         rio_0.5.16       
[21] vctrs_0.3.5       gtools_3.8.2      hms_0.5.3         grid_4.0.3        data.table_1.13.4
[26] R6_2.5.0          plotrix_3.7-8     survival_3.2-7    readxl_1.3.1      foreign_0.8-80   
[31] multcomp_1.4-15   TH.data_1.0-10    carData_3.0-4     car_3.0-10        magrittr_1.5     
[36] scales_1.1.1      codetools_0.2-16  splines_4.0.3     ellipsis_0.3.1    abind_1.4-5      
[41] colorspace_2.0-0  tinytex_0.26      stringi_1.5.3     munsell_0.5.0     crayon_1.3.4 
4

1 回答 1

2

@jay.sf 是对的,estfunsandwich包中的一个函数。它被定义为一个通用函数。只需输入estfun并按回车,您就会看到

function (x, ...) 
{
  UseMethod("estfun")
}

这意味着如果它看到一个类的对象"drc"(它ryegrass.LL.4是),它会搜索一个调用estfun.drc来应用的函数。如果它是类的对象,"foo"它会试图找到estfun.foo. 有关详细信息,请参阅H. Wickham 的书中有关 S3 类的一章

实际上,该drc包甚至提供了一个方法——以及泛型 fromestfun.drc的伴随bread.drc方法。但是,相应的泛型函数没有发现这一点,因为这些方法没有正式注册在包中。在旧版本的 R 中,这曾经可以工作,但现在已被禁用。仅基于命名约定的分派仅适用于全局环境中的函数,但不适用于包中的函数。因此,一个快速而肮脏的解决方案是在全局环境中创建函数的副本:breadsandwichdrcestfun.drc

estfun.drc <- drc::estfun.drc
bread.drc <- drc::bread.drc

更好的方法是将函数注册为 S3 方法,而不是复制它们:

registerS3method("estfun", "drc", drc::estfun.drc)
registerS3method("bread", "drc", drc::bread.drc)

当然,如果drc在包中这样做会更好,这样您作为用户就不必这样做。也许作者会愿意相应地更新包。

于 2021-01-13T11:48:14.060 回答