安装没有文件追加的 R 包?

Install R package without file append?

我正在寻找一种在不允许文件追加的文件系统上安装 R 包的方法(即 Databricks 文件 System/DBFS,可通过 FUSE 安装)。

看起来 install.packages() 默认情况下会对它下载的内容进行一些文件清理和文件附加。

R 是否提供无需附加到文件即可安装包的方法?

到目前为止我的经历是这样的:

foundpkgs: kernlab, /tmp/RtmprBtUFj/downloaded_packages/kernlab_0.9-29.tar.gz
files: /tmp/RtmprBtUFj/downloaded_packages/kernlab_0.9-29.tar.gz
* installing *source* package ‘kernlab’ ...
** package ‘kernlab’ successfully unpacked and MD5 sums checked
** using staged installation
** libs
g++ -std=gnu++11 -I"/usr/share/R/include" -DNDEBUG      -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-EkOYxp/r-base-4.0.4=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c brweight.cpp -o brweight.o
<...snip...>
g++ -std=gnu++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o kernlab.so brweight.o ctable.o cweight.o dbreakpt.o dcauchy.o dgpnrm.o dgpstep.o dprecond.o dprsrch.o dspcg.o dtron.o dtrpcg.o dtrqsol.o esa.o expdecayweight.o inductionsort.o init.o kspectrumweight.o lcp.o misc.o msufsort.o solvebqp.o stringk.o stringkernel.o svm.o wkasailcp.o wmsufsort.o -llapack -lblas -lgfortran -lm -lquadmath -L/usr/lib/R/lib -lR
installing to /dbfs/<...snip...>/00LOCK-kernlab/00new/kernlab/libs
** R
Warning in .file_append_ensuring_LFs(outFile, codeFiles) :
  write error during file append
<...snip...>
Warning in .file_append_ensuring_LFs(outFile, codeFiles) :
  write error during file append
Error in .install_package_code_files(".", instdir) : 
  unable to write code files
ERROR: unable to collate and parse R files for package ‘kernlab’
* removing ‘/dbfs/<...snip...>/kernlab’

The downloaded source packages are in
    ‘/tmp/RtmprBtUFj/downloaded_packages’

如果你需要允许用户使用install.packages,那么我的第一个建议不是一个选项,因为它需要使用辅助功能。如果你能做到,我认为你的评论演练最有意义:

  1. 在 lib-path 前添加两个目录,顺序为:

    .libPaths(c("/localfs/", "/dbfs/", .libPaths())
    

    通过将其添加到现有 .libPaths() 之前,我们保留了系统库路径中可用的内容。通过将 /localfs/ 放在第一个 ,它现在是安装任何软件包的默认位置。

  2. 通过某些 cron 作业或可能作为关闭函数,确保两条路径同步:

    rsync -pr /localfs/* /dbfs/
    

    如果您的系统具有某种形式的退出前脚本功能,那么这应该只需要执行一次;如果你不相信它(也许系统立即关闭 and/or 有超时),那么一个 cron 作业就足够了,如果不完美的话。

    这意味着 两个 中都可以使用一个包,但 R 可以接受。

    这样做的一个问题是,如果较新的安装没有与以前安装的所有相同的文件;考虑一个实际上由于某种原因 减少了 其足迹的包(很少见,也许,但可能)。为此,您需要使用 rsync --delete ...。然而,虽然这是有道理的,但我还没有测试过它,所以我强烈建议你在相信它在生产中无人监督之前测试它。 (我的意思是,使用任意 shell 脚本递归删除文件,可能 会出什么问题...)