Как управлять пакетами R с заданным пределом пути к файлу Windows 255, например, контрольной точкой и R cpp? - PullRequest
0 голосов
/ 20 марта 2020

Итак, я пытался установить R cpp, используя пакет контрольных точек (с датой 1 марта 2020 г.).

Большинство моих пакетов были в порядке, но R cpp специально делает много временных каталогов, которые затем удаляет, например:

00LOCK-Rcpp/00new/Rcpp/include/Rcpp/generated/InternalFunctionWithStdFunction_call.h

Это 84 символа длиной, и я верю, что некоторые длиннее.

Checkpoint также создает множество каталогов, например, с пользовательской библиотекой:

"custom_library/.checkpoint/2020-03-01/lib/x86_64-w64-mingw32/3.6.0/"

Это 67 символов, из которых 52 необходимы только при управлении несколькими датами или версиями контрольных точек.

Это означает, что для пути к файлу, например:

"C:/Users/USER/OneDrive - COMPANY/Documents/LargeDirectory/SubDirectory1/SubDirectory2/custom_library/.checkpoint/2020-03-01/lib/x86_64-w64-mingw32/3.6.0/Rcpp"

Если предположить, что даже временные файлы не могут превышать 255 символов, то у меня определенно осталось <60 символов, доступных для всех R cpp временных предметов. </p>

Я тестировал со следующим кодом:

setwd("C:/Users/USERNAME/OneDrive - COMPANY/Documents/LargeDirectory/SubDirectory1/SubDirectory2/") 
dir.create("custom_library)
checkpoint(as.Date("2020-03-01"),
           checkpointLocation = paste0(
          "SubDirectory2","/custom_library")
          )
y
install.packages("Rcpp") 

Сбой из-за многочисленных «файлов или каталогов не найдено», которые, как я считаю, на самом деле не работают, потому что 00LOCK-Rcpp / 00new / Rcpp / include / Rcpp / не может быть создан, чтобы затем распаковать все файлы .h к нему. Мне было любопытно, поэтому я запустил следующее:

setwd("~") # up to Documents 
dir.create("Rcpptest")
.libPaths("Rcpptest")
install.packages("Rcpp") 

И все установилось нормально.

Любые идеи о том, как сделать контрольную точку, либо не создавать столько вложенных каталогов, либо игнорировать ограничение file_path 255 до тех пор, пока не будет установлен весь пакет?

Пока что я, скорее всего, переместу каталог на несколько уровней, но любая оценка того, верна ли моя догадка или нет, была бы признательна!

1 Ответ

1 голос
/ 20 марта 2020

Я полагаю, что вы правы - насколько мне известно, это ограничение внутренней реализации unzip, используемой R, которая в конечном итоге является ограничением Windows API, используемых Р. См. https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file для дальнейшего обсуждения.

Существует несколько вариантов решения проблемы, которые, возможно, стоит попробовать.

  1. Использование utils::shortPathName() построить так называемый Windows «короткий путь». Это поможет обрезать более длинные компоненты пути и уменьшить размер полного пути.

  2. Создайте соединение для вашего проекта, используя Sys.junction() для локального пути с более короткой длиной, и перейдите к этот каталог. См. ?Sys.junction для получения дополнительной информации - соединение в основном похоже на ярлык Windows или символическую ссылку на каталог.

В каждом случае, мы надеемся, вы сможете построить путь, который «идентичен» вашему текущему каталогу проекта, но достаточно короток, чтобы все могло работать как положено.

...