微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

脚本如何在命令行中运行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’,因此在上面的最后一行中,我将字符串拆分为’=’并拉出文件名.

原文地址:https://www.jb51.cc/bash/387020.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐