【问题标题】:function not found although package is loaded - R尽管加载了包但找不到函数-R
【发布时间】:2018-11-27 18:43:38
【问题描述】:

我一直在使用 R(版本 3.3-3.5)中的 MICE 包(版本 2.2-3.3)处理估算数据集。我现在正在尝试向估算数据集添加一些变量,这些变量在历史上使用cbind.mids() 运行良好(在这种特定情况下,它是来自 Surv 函数的 Surv 对象变量)。由于某种原因,这不再起作用。虽然加载了mice包,但是没有找到函数cbind.mids()

小例子:

> library(mice)
Loading required package: lattice

Attaching package: ‘mice’

The following objects are masked from ‘package:base’:

cbind, rbind

> cbind.mids()
Error in cbind.mids() : could not find function "cbind.mids"

注意 1:?cbind.mids 仍然可以工作并找到帮助文件。仅使用mice 包中的cbind() 也不起作用,它会将我的新变量合并到mids 对象中,但它们在后续分析中不起作用。

注意 2:我尝试重新安装 R、鼠标和 Rstudio。我没有收到任何其他错误消息以供指导。

有谁知道它为什么会这样? cbind.mids() 功能是否因某种原因被删除,还是我的系统有问题?

【问题讨论】:

  • 隐藏了吗?试试mice:::cbind.mids
  • 嗯,它就在那里:getAnywhere(cbind.mids)returns "找到一个匹配 'cbind.mids' 的对象\n 它在以下地方找到\n namespace:mice",但它没有显示在方法(cbind)的结果中。我想知道它是否没有正确注册。有时作者会在函数名称中添加句点,但它们实际上并不属于 S3 组。试试mice:::cbind.mids
  • 根据包源和文档,这是按预期工作的。 cbind.mids 不应该直接使用。

标签: r r-mice


【解决方案1】:

我将使用函数“cbind.mids {mice}”的 R 文档中描述的函数“cbind”。它也适用于 Surv 对象变量。

require(mice);
require(survival);

with(lung, Surv(time, status))
cbind(
  x = Surv(heart$start, heart$stop, heart$event)
  ,y = Surv(heart$start, heart$stop, heart$event));

【讨论】:

    【解决方案2】:

    cbind.mids() 是来自mice 包的cbind() 函数。在 R 控制台中,输入 ?cbind,然后从 mice 包中选择一个,然后在底部(另请参阅)单击 cbind.mids 并查看示例。您会看到函数cbind 在需要时自动执行cbind.mids。至少我很确定这种情况,就像 data.table 中的合并函数名称为 merge.data.table 但您在使用该函数时只写 merge。告诉我它是否适合你。

    编辑:尝试使用示例中的格式。如果它不起作用,那么该功能可能不再在包中更新/使用?

    编辑 2:mice::cbind() 上的官方说明:

    "标准的 base::cbind() 和 base::rbind() 总是分派到 base::cbind.data.frame() 或 base::rbind.data.frame() 如果其中之一 参数是一个data.frame。鼠标包中定义的版本 拦截用户命令并测试第一个参数是否有 “中”类。 如果是,函数分别调用cbind.mids() rbind.mids()。在所有其他情况下,呼叫被转发到标准 基础包中的函数。”

    【讨论】:

    • 为什么cbind.mids*没有出现在methods(cbind)的结果中? (您只证明了cbind.mids 有一个帮助页面。
    • 对,我怀疑是这样,也许这个错误是我误解了实际问题的结果。奇怪的是,使用 cbind.mids(mids, SurvObj) 过去可以正常工作,但现在不行了。将 mids 对象与向量合并似乎适用于 cbind(mids, vector)。当我尝试与 SurvObjects 的向量合并时,合并有效,但对生成的 mids 对象执行任何操作都会失败,并且我收到错误消息“bind_rows_(x, .id) 中的错误:参数 40 的长度必须为 74958,而不是 149916 "。
    • @42- 它没有出现在列表中,因为它不是通过 S3 调度调用的,而是手动调用的。 cbind 的 S3 调度已损坏。 :-(
    • @Wernicke “rbind.mids”函数也发生了同样的事情。他们可能更新了软件包,因此您不再需要编写长格式(尽管我觉得这有点烦人)。此外,我需要您的数据样本(或可重现的示例)来帮助您处理此错误消息。编辑:去阅读我的答案的第二个编辑。
    【解决方案3】:

    现在我可以回答最初的问题和我问康拉德的问题了。 mice 函数屏蔽了基本 S3 cbind 函数。在我加载鼠标时注意到了这一点,但我没有给予足够的关注。因此,在首先加载鼠标后对 cbind 的任何调用都会通过此函数(而不是通常的 S3 UseMethod-dispatch)。我认为认为通常的 S3 调度被“屏蔽”或隐藏而不是说它“损坏”更有帮助:

    > `cbind`
    function (...) 
    {
        if (is.null(attr(list(...)[[1]], "class"))) 
            return(base::cbind(...))
        if ("mids" %in% attr(list(...)[[1]], "class")) 
            return(cbind.mids(...))
        else return(base::cbind(...))
    }
    <bytecode: 0x1b399908>
    <environment: namespace:mice>
    

    所以原来的 S3 函数就在那里,只是隐藏在它们定义的任何命名空间中:

    > getS3method('cbind', 'mids')
    Error in getS3method("cbind", "mids") : S3 method 'cbind.mids' not found
    > getS3method('cbind', 'data.frame')
    function (..., deparse.level = 1) 
    {
        if (!identical(class(..1), "data.frame")) 
            for (x in list(...)) {
                if (inherits(x, "data.table")) 
                    return(data.table::data.table(...))
            }
        data.frame(..., check.names = FALSE)
    }
    <bytecode: 0x51233f0>
    <environment: namespace:base>
    
    > getS3method('cbind', 'sf')
    function (..., deparse.level = 1, sf_column_name = NULL) 
    {
        st_sf(data.frame(...), sf_column_name = sf_column_name)
    }
    <bytecode: 0xb380a80>
    <environment: namespace:sf>
    

    (我不确定这是否能回答以前版本的鼠标包的任何行为变化。为此,首先要转到news(pac='mice')

    V2.41    10jul2017 SvB
    ADDED    New feature: `where`argument to mice
    ADDED    New `wy` argument to imputation functions
    ADDED    New mice.impute.2l.sys(), author Shahab Jolani
    UPDATE   Many simplifications and code enhancements
    FIXED    Broken cbind() function
    

    它没有说明mice::cbind 函数以何种方式损坏或分成了多少块。

    V2.33    11apr2017 SvB
    CHANGED  Stylistic changes to mice function (thanks Ben Ogorek)
    CHANGED  calls to cbind.mids() replaced by calls to cbind()
    

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 2019-01-03
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多