функция не найдена, хотя пакет загружен - R - PullRequest
0 голосов
/ 27 ноября 2018

Я работал с вмененным набором данных, используя пакет MICE (версии 2.2-3.3) в R (версии 3.3-3.5).Сейчас я пытаюсь добавить некоторые переменные в вмененный набор данных, которые исторически работали нормально, используя 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 по-прежнему работает и находит файл справки.Использование только cbind() из пакета мышей также не работает, оно объединит мои новые переменные с объектом mids, но они не будут работать в последующем анализе.

Примечание 2: я попытался переустановить R, мыши и Rstudio.Я не получаю никаких других сообщений об ошибках для руководства.

Кто-нибудь знает, почему он так себя ведет?Функция cbind.mids() по какой-то причине удалена или это проблема моей системы?

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Я бы использовал функцию "cbind", как описано в документации R функции "cbind.mids {mice}".Работает также с переменными объекта 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));
0 голосов
/ 27 ноября 2018

Теперь я могу ответить на оригинальный вопрос и тот, который я задал Конраду.Функция 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()
0 голосов
/ 27 ноября 2018

cbind.mids() - это '' в '' функции cbind() из пакета mice.В консоли R напишите ?cbind, затем выберите пакет из пакета mice, затем внизу (см. Также) нажмите cbind.mids и посмотрите примеры.Вы увидите, что функция cbind выполняет cbind.mids автоматически при необходимости.По крайней мере, я почти уверен в этом, так же как функция слияния в data.table - это имя merge.data.table, но вы пишете merge только при использовании этой функции.Скажите, работает ли он у вас.

Редактировать: Попробуйте использовать формат из примера.Если это не работает, то, возможно, функция больше не обновляется / не используется в пакете?

Редактировать 2: Официальное примечание по mice::cbind():

"Стандартная база:: cbind () и base :: rbind () всегда отправляют в base :: cbind.data.frame () или base :: rbind.data.frame (), если один из аргументов является data.frame. Версии, определенные впакет mice перехватывает пользовательскую команду и проверяет, имеет ли первый аргумент класс «mids». Если это так, функция вызывает cbind.mids (), соответственно rbind.mids (). Во всех остальных случаях вызов перенаправляетсястандартные функции в базовом пакете. "

...