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()
в начале вашего скрипта (до вызова библиотеки).