0

所以我试图使用检查点包(日期为 2020 年 3 月 1 日)安装 Rcpp。

我的大多数包都很好,但是 Rcpp 专门创建了很多临时目录,然后将其删除,例如:

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 个字符可用于所有 Rcpp 临时对象。

我使用以下代码进行了测试:

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 限制?

现在,我可能会将目录向上移动几级,但如果我能深入了解我的猜测是否真的正确,或者我是否遗漏了什么,我将不胜感激!

4

1 回答 1

2

我相信您是正确的——据我所知,unzip这是 R 使用的内部实现的限制,这最终是 R 使用的 Windows API 的限制。请参阅https://docs.microsoft.com /en-us/windows/win32/fileio/naming-a-file进行更多讨论。

有几个选项可以缓解可能值得尝试的问题。

  1. 用于utils::shortPathName()构造所谓的 Windows 'short path'。这将有助于修剪较长的路径组件并缩小完整路径的大小。

  2. Sys.junction()使用长度较短的本地路径创建项目的连接点,然后移动到该目录。有关?Sys.junction更多信息,请参阅 —— 联结基本上类似于 Windows 快捷方式,或指向目录的符号链接。

在每种情况下,您都应该希望能够构建一个与当前项目目录“相同”的路径,但要足够短,以使事情可以按预期运行。

于 2020-03-20T05:08:03.480 回答