Install.packages устанавливает исходный код в консоли Rstudio, но в двоичном виде при использовании Rscript - PullRequest
0 голосов
/ 17 апреля 2019

Я работаю над пакетом, который поддерживает взаимодействие со структурой библиотеки альтернативной формы, которая поддерживает параллельную установку нескольких версий пакета (RVClibrary, скоро на CRAN). Недавно я встретил какое-то странное поведение и надеюсь, что кто-нибудь сможет объяснить.

При установке пакета он может иногда иметь версию source , которая старше, чем версия binary . Исходный код (не скомпилированный код C) в этом случае еще не скомпилирован (by ...?), Но содержит более позднюю версию, чем уже скомпилированная двоичная версия. В моем случае показано следующее:

  There is a binary version available but the source version is later:
      binary source needs_compilation
rlang  0.2.0  0.3.4              TRUE

Пользователь получает выбор относительно того, должен ли A или B быть относительно установленным или скомпилированным. Другими словами, если вы хотите версию 0.2.0 или 0.3.4 (для которой вам нужен Rtools).

Этот выбор не будет предоставлен, если установлена ​​опция install.packages.compile.from.source.

> options(install.packages.compile.from.source = "always")
> install.packages('rlang', lib = "C:\\test", quiet = TRUE, repos = "http://cran.us.r-project.org")

  There is a binary version available but the source version is later:
      binary source needs_compilation
rlang  0.2.0  0.3.4              TRUE

installing the source package ‘rlang’

Источник установлен.

Но когда я создаю простой скрипт (я называю его install_test.R):

packageName <- commandArgs(trailingOnly = TRUE)[1]

cat(packageName, '\n')

options(install.packages.compile.from.source = "always")
install.packages(packageName, lib = "C:\\test", quiet = TRUE, repos = "http://cran.us.r-project.org")

Следующее действует одинаково с системой в R и непосредственно в CMD.
(убедитесь, что у вас есть путь к Rscript.exe в переменной окружения PATH)

> system("Rscript.exe C:\\test\\install_test.R rlang")
rlang 

  There is a binary version available but the source version is later:
      binary source needs_compilation
rlang  0.2.0  0.3.4              TRUE

  Binaries will be installed
package 'rlang' successfully unpacked and MD5 sums checked

Двоичные файлы установлены!

Мне нужно всегда иметь возможность установить исходную версию , чтобы не сталкиваться с проблемами зависимости. Например, ggplot2 зависит от >= 0.2.1 уже ...

Резюме

  • У меня установлен Rtools 3.5 (который devtools может найти по обоим маршрутам и считает, что он не совместим ..., но установка из исходного кода работает нормально в Rstudio, и (https://cran.r -project.org / bin / windows / Rtools / ) CRAN говорит, что он совместим с)
  • R версия:
platform       x86_64-w64-mingw32
arch           x86_64
os             mingw32
system         x86_64, mingw32
year           2016
month          06
day            21
svn rev        70800
language       R
version.string R version 3.3.1 (2016-06-21)
nickname       Bug in Your Hair
  • под управлением Windows 10
  • Здесь можно увидеть разницу между переменными среды (Rstudio справа, Rscript слева): https://pasteboard.co/IasIVMe.png

(мое редактирование здесь удалено, чтобы сохранить его в чистоте. См. Мой ответ (или историю), чтобы прочитать больше)

1 Ответ

0 голосов
/ 17 апреля 2019

Я пробовал разные конфигурации переменных среды, чтобы проверить, можно ли установить / скомпилировать из источника с помощью экземпляра Rscript.exe , работающего install.packages.

(Он работает по-другому (менее ограниченно) при работе с консоли Rstudio. Кажется, он распознает запись реестра . Он работает без указания переменной var вообще).

  1. Установить MAKE переменная (Sys.setenv(MAKE = 'C:\\Rtools\\bin\\make.exe')) (частично УСПЕШНО)
  2. Установить PATH переменную (добавление в начало)
    • Включить все папки Rtools bin (C:\\Rtools\\bin;C:\\Rtools\\mingw_32;C:\\Rtools\\mingw_64) (УСПЕШНО)
    • Включить Rtools * только 1023 * (УСПЕШНО)
    • Включить Rtools * только 1026 * (до конца переменной PATH) (SUCCEEDS)
    • Включить Rtools * только 1029 * (FAILS)
    • Включить Rtools * только 1032 * (FAILS)
  3. Задайте только PATH, а не MAKE.

При условии, что установлено следующее свойство: options(install.packages.compile.from.source = "always")

Решение 1:
Функция install.packages проверяет, следует ли попытаться выполнить сборку из исходного кода, ища переменную среды MAKE nzchar(Sys.which(Sys.getenv("MAKE", "make"))). К сожалению, если вы укажете только переменную среды MAKE, для которой необходимо указать полный путь (Sys.which), он все равно не найдет все необходимые инструменты для сборки исходного кода (Rtools / bin), которые кажутся необходимыми, и сбой без каких-либо разъяснений:

> Sys.setenv(MAKE = 'C:\\Rtools\\bin\\make.exe')
> system("Rscript.exe C:\\R_projecten\\test\\install_test.R rlang")

     There is a binary version available but the source version is later:
         binary source needs_compilation
   rlang  0.2.0  0.3.4              TRUE

   installing the *source* package 'rlang'

   Warning messages:
   1: running command '"C:/PROGRA~1/R/R-33~1.1/bin/x64/R" CMD INSTALL -l "C:\R_projecten\test\test4" C:\Users\SB947~1.FRO\AppData\Local\Temp\RtmpwbEcl6/downloaded_packages/rlang_0.3.4.tar.gz' had status 1 
   2: In install.packages(packageName, lib = "C:\\R_projecten\\test\\test4",  :
     installation of package 'rlang' had non-zero exit status

Таким образом, решения 1 недостаточно, и его даже можно заменить решением 3:

   PATH : C:\Program Files\R\R-3.3.1\bin\x64; ....  ;C:\Rtools\bin; 
   MAKE : 

     There is a binary version available but the source version is later:
         binary source needs_compilation
   rlang  0.2.0  0.3.4              TRUE

   installing the source package 'rlang'

Как показано, предоставляет только C:/Rtools/bin в PATH, и никакой переменной MAKE недостаточно .

Проверка, описанная ранее, проверяет, существует ли переменная MAKE, и использует это значение, или оно будет искать make, имя программы (по умолчанию Sys.getenv). При указании только PATH, можно найти файл make(.exe), и MAKE env var не требуется. С дополнительным преимуществом уже указанием на каталог Rtools / bin, из которого, очевидно, требуется больше файлов.

Какие файлы мне все еще интересно ...

ПРИМЕЧАНИЕ. Проверка nzchar(Sys.which(Sys.getenv("MAKE", "make"))) НЕ является достаточной для доказательства того, что ваша среда готова для сборки из источника.

...