【问题标题】:Migrating R library from /usr/lib/R/library to a custom library将 R 库从 /usr/lib/R/library 迁移到自定义库
【发布时间】:2017-11-09 06:55:03
【问题描述】:

这台 Linux 机器上安装的所有 R 包都安装在/usr/lib/R/library 中。我想将这些包移动到另一个位置,例如/home/username/.R_libs。我不仅想在这个新位置安装包,还想将所有以前安装的包迁移到那个位置。

.libPaths() 的输出为:

[1] "/home/username/.R_libs" "/usr/lib/R/library"

但是,如果我只是移动所有的包裹,像这样:

sudo mv /usr/lib/R/library/* /home/username/.R_libs/

R 无法再启动,因为它似乎无法找到基础包。

关于环境变量,$R_LIBS 设置为/home/username/.R_libs,而$R_HOME$R_LIBS_USER 在shell 中未设置。但是,出于某种原因:

> Sys.getenv("R_LIBS")
[1] "/home/username/.R_libs"
> Sys.getenv("R_HOME")
[1] "/usr/lib64/R"
> Sys.getenv("R_LIBS_USER")
[1] "~/R/x86_64-pc-linux-gnu-library/3.4"

注意~/R/x86_64-pc-linux-gnu-library/3.4 不存在,我不想创建它,我只想使用/home/username/.R_libs

简而言之,我希望从现在开始 R 将只考虑 /home/username/.R_libs 并始终将库安装到该位置(或从该位置读取库)而不要求确认或其他选项。

如果我理解正确的话,最好的选择可能是只移动非基础包,即手动安装的包。这可能吗?这可以做到吗? 请注意,我不想卸载然后重新安装所有软件包,

【问题讨论】:

  • export R_LIBS="/home/username/.R_libs"
  • @Masoud 对不起,我不明白。 R_LIBS 已经设置为我希望包所在的文件夹,即/home/username/.R_libs
  • 您可以在 R .libPaths("/home/username/.R_libs") 中运行它
  • @Masoud .libPaths() 已经返回 [1] "/home/username/.R_libs" "/usr/lib/R/library"。应该有什么区别?
  • 我的意思是你想将它设置为默认值。但是,让我们暂停讨论。在确定它对你有用后,我会发布一个答案。

标签: r linux package installation


【解决方案1】:

我通过在 R 中列出所有具有 Priority NA 或“推荐”的包并仅使用 bash 脚本移动这些包来解决这个问题。这将忽略 R 似乎需要存储在当前位置的所有基本 R 包。因此,从 R 创建一个文本文件以从 bash 脚本中读取:

ip <- installed.packages(lib.loc="/usr/lib/R/library/")[ , "Priority"]
write.table(installed.packages(lib.loc="/usr/lib/R/library/")[is.na(ip) | ip=="recommended", 1], file="ip.txt", row.names=FALSE, quote=FALSE)

请注意,您需要将/usr/lib/R/library/ 更改为要从中复制的正确文件夹。

然后运行这个 bash 脚本(记得设置你自己的目标目录,存储在 output 变量中,以及你的用户名,存储在 user 变量中):

#!/bin/bash

set -e
{
input="/usr/lib/R/library/"
output="/home/username/.R_libs/"
user="username"
packages="ip.txt"

for p in $(cat ${packages})
do
    if [ -e ${input}/${p} ]; then
        echo Moving package ${p}
        mv ${input}/${p} ${output}/${p}
    else
        echo Package ${p} is not present in ${input}
    fi
done
echo Changing perimssions...
chown -R ${user} .R_libs/*
echo All done!
}

一切都应该正确移动。

【讨论】:

  • 很高兴您找到了解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
相关资源
最近更新 更多