Установка и загрузка пакетов с одной функцией

#r #function #install.packages

#r #функция #install.packages

Вопрос:

Я пытался написать функцию для замены функций library и install.packages из R, которая загружает функции, если она установлена, и устанавливает и загружает, если это не так. В первом случае это работает нормально, но когда я пытаюсь установить функцию, используя это, даже после установки она выдает ошибку «нет пакета с именем …». Пакеты устанавливаются правильно, но мне не удалось установить и загрузить за один запуск одной и той же функции. Я добавил команду sleep, надеясь, что она исправит это, но этого не произошло. Кто-нибудь знает, почему?

 insist = function(name){
    #enables entering package name without quotes
    name = substitute(name) 
    name = as.character(name)

    if (!require(name, character.only = T)) {
        install.packages(name)
        Sys.sleep(2)
        library(name, character.only = T)
    }
}
  

Комментарии:

1. Взгляните на github.com/trinker/pacman после установки p_load вы делаете именно то, что вам нужно.

2. Кажется, он использует многоуровневую структуру для установки пакетов и их загрузки, но я не смог найти ничего принципиально отличного в его коде, что позволило бы ему работать и объяснить, почему мой сбой. Тщательно проверю, когда у меня будет больше времени

Ответ №1:

Это сообщение на самом деле исходит от require() and, а не install.packages() от or library() . Держу пари, что пакет все еще добавляется в ваш путь поиска (по крайней мере, для меня). Поэтому я думаю, что вы должны быть более агрессивными в отношении подавления этого предупреждения. Попробуйте это.

 insist = function(name){
    #enables entering package name without quotes
    name = substitute(name) 
    name = as.character(name)

    if (suppressWarnings(!require(name, character.only = T, quietly=T))) {
        install.packages(name)
        library(name, character.only = T)
    }
}
  

Комментарии:

1. Это не так. В начале require строки 6 выдается предупреждение, package … недоступно. У меня с этим нет проблем, но ошибка возникает из-за попытки библиотеки загрузить пакет в конце. В результате у меня возникает ошибка, и пакет не загружается, а только устанавливается.

2. Вы выполнили пошаговое выполнение функции с помощью отладчика для подтверждения? Если это так, то я не смог повторить вашу ошибку. Мой приведенный выше код работает без ошибок / предупреждений для меня с тестируемыми пакетами.

3. Как ни странно, это не выдает ошибку. Это становится логичным.по какой-то причине возвращает True само по себе и вместо этого возвращает предупреждение. Но это явно из библиотеки не требуется. Я даже пытался вручную установить logical.return в false, но это не сработало Warning message: In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : there is no package called ‘corrplot’