Rscript: Нет пакета под названием...?

Я хочу запустить R файлы в пакетном режиме с помощью Rscript, однако, похоже, он не загружает библиотеки, которые мне нужны. Конкретная ошибка, которую я получаю:

Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted

Однако у меня есть пакет timeSeries и вы можете загрузить его из Rstudio, RGui и R из командной строки без проблем. Проблема, похоже, возникает только при запуске script с использованием Rscript.

Мои переменные системы/среды настроены как:

C:\Program Files\R\R-3.1.0\bin\x64 (Appended to PATH)
R_HOME = C:\Program Files\R\R-3.1.0
R_User = Patrick

Я запускаю ту же версию R в RStudio, RGui и R из командной строки. Я также проверил .Library из этих трех источников и получил тот же результат.

Как запустить Rscript из командной строки с пакетами, которые я использую (и установил) в R?

EDIT:

Я использую Rscript через Rscript script.r в командной строке Windows в каталоге, где находится script.r.

Выходной сигнал Rscript -e print(.Library) равен [1] "C:/PROGRA~1/R/R-31~1.0/library"

что согласуется с тремя другими вариантами, которые я упомянул: [1] "C:/PROGRA~1/R/R-31~1.0/library"

Однако, если я поместил это в свой script:

print(.libPaths()) 
library(timeSeries) #This is the package that failed to load

Я получаю вывод:

[1] "C:/Program Files/R/R-3.1.0/library"
Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted

Соответствующий вызов в RStudio дает дополнительный путь к тому, где фактически установлен пакет:

> print(.libPaths())
[1] "C:/Users/Patrick/Documents/R/win-library/3.1" "C:/Program Files/R/R-3.1.0/library"    

Ответы

Ответ 1

Короче говоря, значение, возвращаемое вызовом Sys.getenv('R_LIBS_USER') в R.exe, должно быть таким же, как значение, возвращаемое вызовом этого в командной строке:

Rscript.exe -e "Sys.getenv('R_LIBS_USER')"

и указанное значение должно быть включено в этот вызов командной строки:

Rscript.exe -e ".libPaths()"

Обратите внимание, что значения R_LIBS_USER могут отличаться между R.exe и Rscript.exe, если значение R_USER изменяется, либо в .Rprofile или в целевом поле ярлыка пользователя R.exe, и в целом я обнаружил, что пользовательская библиотека (т.е. .libPaths()[2]) просто не задано в Rscript.exe

Так как я предпочитаю устанавливать R_USER на мой USERPROFILE, я включаю следующий блок в верхней части .R файлов, которые я хочу запускать на многоуровневых компьютерах или в Rscript.exe .Rprofile ( т.е. Rscript -e "path.expand('~/.Rprofile')"):

# =====================================================================
# For compatibility with Rscript.exe: 
# =====================================================================
if(length(.libPaths()) == 1){
    # We're in Rscript.exe
    possible_lib_paths <- file.path(Sys.getenv(c('USERPROFILE','R_USER')),
                                    "R","win-library",
                                    paste(R.version$major,
                                             substr(R.version$minor,1,1),
                                             sep='.'))
    indx <- which(file.exists(possible_lib_paths))
    if(length(indx)){
       .libPaths(possible_lib_paths[indx[1]])
    }
    # CLEAN UP
    rm(indx,possible_lib_paths)
}
# =====================================================================

Ответ 2

Как упоминалось в комментариях, кажется, что Rscript автоматически не распознает путь к библиотеке по умолчанию. Я пишу R script, который должен быть источником из командной строки на компьютерах разных людей, поэтому я придумал это более общее обходное решение:

  • Сначала сохраните путь библиотеки по умолчанию в переменной (функции Rscript-sourced могут найти это, они просто не автоматизированы)
  • Затем включите этот путь в вызов library() с аргументом lib.loc =.
  • Это должно работать независимо от того, какой путь находится на данном компьютере.

    library.path <- .libPaths()
    library("timeseries", lib.loc = library.path)
    

Еще раз спасибо @flodel выше, чтобы поставить меня на правильный путь

Ответ 3

Этот ответ не поможет оригинальному ассеру (pbreach), но он может помочь кому-то другому, который споткнется по этому вопросу и имеет схожую проблему со мной.

У меня есть много файлов bash .sh script, которые вызывают RScript для выполнения файлов .R. Моя операционная система Windows 10, и я выполняю эти bash файлы с помощью cygwin.

Все работало нормально до вчерашнего дня, когда я, наконец, обновил свой R от Revolution R 8.0.1 beta до Microsoft R Open 3.4.1. После этого обновления каждый bash script, который вызвал RScript, не удалось из-за той же самой причины, заданной здесь (например, Error in library(zoo) : there is no package called 'zoo').

Исследование показало, что RScript действительно отлично работает, если вызывается из DOS shell вместо оболочки cygwin bash.

Например, если я выполняю это в DOS shell

C:\Progra~1\Microsoft\ROpen~1\R-3.4.1\bin\x64\Rscript.exe -e ".libPaths()"

Я вижу вывод

[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"

В конце концов я обнаружил причину. Как объяснено в FAQ R FAQ, чтобы определить его домашний каталог, R сначала использует переменную среды R_USER, если она определена, иначе она будет использовать переменную среды HOME, если она определена, иначе она будет использовать личный каталог Windows.

Моя конфигурация Windows не определяет переменные среды R_USER или HOME. Итак, в случае DOS shell R использует мой личный каталог Windows (C:/Users/HaroldFinch/Documents). Это хорошо, потому что там установлены все мои библиотеки (C:/Users/HaroldFinch/Documents/R/win-library/3.4).

Напротив, cygwin определяет и экспортирует переменную среды HOME, которая указывает на мой пользовательский каталог cygwin, в котором отсутствует материал R. Следовательно, RScript, вызванный из cygwin, имел неправильный домашний каталог R и так не загружал библиотеки.

Вероятно, есть много способов решить эту проблему. Я решил, чтобы мой bash script установил переменную среды R_USER, которая указывает на мою пользовательскую директорию Windows.

Например, если я выполняю это в cygwin bash shell:

R_USER="C:/Users/HaroldFinch/Documents"
export R_USER
/cygdrive/c/Progra~1/Microsoft/ROpen~1/R-3.4.1/bin/x64/Rscript.exe -e ".libPaths()"

Я вижу вывод

[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"

который является точно таким же результатом, что и предыдущий пример оболочки DOS.

Ответ 4

Другая причина - это пакрат. Если вы работаете с packrat, RStudio включит его для вас при открытии проекта. RScript нет, поэтому вам нужно packrat::on() в начале вашего скрипта (до вызова библиотеки).