mac上R是怎么执行起来的(对shell的考察)?

目的

我有两个版本的R, 3.6和4.0. 通过R命令我能执行的是4.0, 我希望能通过R3.6也能执行3.6的. 为此, 我需要考察在执行R的时候, 发生了什么.

略去过程, 直接说结论.

总结发现
  • 执行R其实是执行一个shell脚本, 这个脚本主要干了这些事:
    • 设置了一些环境变量, 最重要的是R_HOME_DIR(R_HOME=${R_HOME_DIR}), 其它一些环境变量, 比如下面提到的R_HOME_DIR都是依赖R_HOME的. 而R_HOME=/Library/Frameworks/R.framework/Resources
    • 启动R_binary=" ${R_HOME}/bin/exec$ {R_ARCH}/R". 但如果不经过这个R shell脚本执行是会出错的, 因为它依赖一堆环境变量(之后会说到).
  • 刚刚说R_HOME的这个路径/Library/Frameworks/R.framework/Resources, 其实是一个symlink, 它直接指向的是/Library/Frameworks/R.framework/Versions/Current, 而后者也就是/Library/Frameworks/R.framework/Versions/Current也是一个symlink, 指向的是/Library/Frameworks/R.framework/Versions/4.0/Resouces.
  • 不同版本的R在/Library/Frameworks/R.framework/Versions下, 对每个R, 真实的home目录都是其下(比如Versions/3.6)的Resources文件夹.
  • 3.6和4.0的Resources/bin/R两个文件完全相同. R怎么做到更新中, 能进行最小的改动的, 答案就是symlink.
  • /usr/local/bin/R是个symlink, 指向Resources文件夹下的R, 后者也是symlink, 指向的是home目录下bin目录的R.
如何才能自由地在3.6与4.0中穿梭呢(虽然我很可能并不需要3.6)?

很简单. 我想只要再创建一个一模一样的shell脚本, 再改一下R_HOME的路径, 从R_HOME=/Library/Frameworks/R.framework/Resources指向/Library/Frameworks/R.framework/Versions/3.6/Resouces 就可以了. 于是我拷贝了R shell脚本到/usr/local/bin/下, 起名叫3.6

仅仅只有这些行不一样:

R_HOME_DIR=/Library/Frameworks/R.framework/Versions/3.6/Resources
R_SHARE_DIR=${R_HOME}/share # 其实这是等价的, 之前的脚本用的是绝对路径, 我觉得这种写法很丑陋
R_INCLUDE_DIR=${R_HOME}/include # 同上
R_DOC_DIR=${R_HOME}/doc # 同上

然后我就也能使用R3.6了(虽然并没有什么用..).

posted @ 2021-01-04 18:27  Tokubara  阅读(409)  评论(0编辑  收藏  举报