脚本如何在命令行中运行R?

我有一个脚本(称之为Main.R),它具有以下代码,以便在运行时找到它自己:
frame_files <- lapply(sys.frames(),function(x) x$ofile)
frame_files <- Filter(Negate(is.null),frame_files) 
main.dir <- dirname(dirname(frame_files[[length(frame_files)]]))

这用于获取其自己的目录main.dir上方的目录,该目录用于调用相对于此路径的其他脚本.

例如,我对从命令行运行此脚本感兴趣

R CMD BATCH Main.R

要么

Rscript Main.R

不幸的是,当我从命令行调用脚本时,上面的命令不起作用.

是否有我可以在Main.R中使用的代码或者我可以使用的R或Rscript的调用选项?

更具体地说,该解决方案需要在Windows中运行.

下面是一个解决方案,当使用source或Rscript运行脚本时,它将为您提供正确的文件目录路径.
# this is wrapped in a tryCatch. The first expression works when source executes,the
# second expression works when R CMD does it.
full.fpath <- tryCatch(normalizePath(parent.frame(2)$ofile),# works when using source
               error=function(e) # works when using R CMD
                     normalizePath(unlist(strsplit(commandArgs()[grep('^--file=',commandArgs())],'='))[2]))
dirname(full.fpath)

关键是normalizePath函数.给定相对或缩写的路径名,normalizePath将返回有效路径或引发错误.从Rscript运行脚本时,如果为normalizePath提供当前脚本的基本文件名,它将返回完整路径,无论您当前的目录是什么.当你提供R CMD的相对路径并且当前目录中有一个同名的脚本时,它甚至可以获得正确的路径!

在上面的代码中,我从commandArgs返回的一个字符串中提取文件名.如果你看一下commandArgs的输出,你会看到文件名是第四个参数.参数记录为’–file = yourscript.R’,因此在上面的最后一行中,我将字符串拆分为’=’并拉出文件名.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...