看教程不够直观,那就看视频吧! >>点击加载视频
在敲了很多R脚本,然后需要互相引用的时候就会遇到路径问题了
1、如果获取当前工作目录使用:
getwd()
2、获取R 包安装目录使用:
.libPaths()[1]
3、获取R脚本当前目录咋整?
这个问题其实是比较坑的,笔者就遇到过这样的问题,场景是这样的有个公共的R脚本,其他脚本都要source它,然而这个脚本和其他项目放在同一目录下,因为这些脚本是封装好了的,直接用命令行调用比如Rscript, 那么问题来了,怎么在脚本中source这个公共的脚本呢,如果直接写绝对路径,那么当你把这些脚本换个目录时全部修改一下路径?当脚本有一百多个的时候你修改一下看看。
R里面没有直接获取当前脚本的目录,笔者苦思冥想想到一个办法是这样的:
source(paste0(gsub('library$','',.libPaths()[1]),'/common.r'))
从这句话里可以看出将公共的脚本丢到R 包安装目录里,然后统一source,问题解决了!!!
然后过了一两月,要将这个流程移植到另外一台服务器上,我们的程序猿搞了一天怎么都没有配置成功,后来灵机一动想起来了common.r没有和项目一起打包过去。。。。。。。。。。。
痛定思痛,决定要改掉这种操作!!!!!
最后发现在命令行调用R脚本时可以是可以获取到当前脚本的:
比如:Rscript D:/AAA/test.R
Args <- commandArgs()
print(Args[4])
#--file=D:/AAA/test.R
substr(Args[4],8,nchar(Args[4]))
#D:/AAA/test.R
得到了当前运行脚本的路径!
问题又来了,如何得到D:/AAA这个目录呢?
R里面对于斜杠操作简直不方便,尤其是这个目录可能很长,可能很短,然后linux和Windows系统斜杠还不一样,用字符串操作显然不行啊
小技巧来了:
R里面提供了一个函数dirname,这个不常用的函数解决了这个复杂的问题
最终我们的代码换成了这个:
source(paste0(dirname(substr(Args[4],8,nchar(Args[4]))),'/common.r'))
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!