我已经查看过类似的许多问题(见帖子末尾),但我没有找到任何实际完成我需要的解决方案。我根据项目在Windows或Fedora上编码,并为使用Windows和多个Linux发行版的人编写代码。
我的部分工作是为自动分析数据和创建图表的人制作R脚本。最常见的是,我只是向他们发送脚本,它将生成图表。这样,如果数据发生变化或扩展,我不需要为它们重新运行脚本(也可以根据需要进行更改)。
问题在于我不知道如何获取R脚本以找出它自己的位置。能够创建如下工作的代码非常方便:
这个问题只涉及第2步。只要我能做到这一点,其他所有事情都会顺利进行。有这样的东西会很好:
setwd(FindThisScriptsLocation())
行:source(...,chdir = T)已被建议here,但它不能用于脚本引用自身,除非它知道自己的路径。
以下是一些相关问题:
How to get R to recognize your working directory ...(设置默认工作目录)
Rscript: Determine path of executing script(一个脚本调用其他人;没有找到答案)
答案 0 :(得分:8)
遇到同样的问题,这就是我提出的问题。 它适用于Windows和Linux上的source()和rmarkdwon :: render()。
更新:函数get_scriptpath()现在作为我在CRAN上的envDocument包的一部分提供。见https://cran.r-project.org/package=envDocument
#' Get the path of the calling script
#'
#' \code{get_scriptpath} returns the full path of the script that called this function (if any)
#' or NULL if path is not available
#'
#' @examples
#' mypath <- get_scriptpath()
#' @export
#'
get_scriptpath <- function() {
# location of script can depend on how it was invoked:
# source() and knit() put it in sys.calls()
path <- NULL
if(!is.null(sys.calls())) {
# get name of script - hope this is consisitent!
path <- as.character(sys.call(1))[2]
# make sure we got a file that ends in .R, .Rmd or .Rnw
if (grepl("..+\\.[R|Rmd|Rnw]", path, perl=TRUE, ignore.case = TRUE) ) {
return(path)
} else {
message("Obtained value for path does not end with .R, .Rmd or .Rnw: ", path)
}
} else{
# Rscript and R -f put it in commandArgs
args <- commandArgs(trailingOnly = FALSE)
}
return(path)
}
答案 1 :(得分:4)
“加载脚本”进程中的某个位置,您将传递R脚本的名称和路径。 我建议捕获该信息,然后使用包装器脚本来执行主脚本。
包装器函数,它将要执行的脚本的路径和文件名作为参数
FILE <- "~/Desktop/myFolder/InHere/myScript.R"
在包装函数开始时,让用户点击文件:
FILE <- file.choose()
DIR <- dirname(FILE)
并且您有目录/文件夹,您可以正常执行脚本DIR
作为参数
答案 2 :(得分:3)
嘿,我有一个可能的解决方案,这是一些额外的初步工作,但应该能够做你需要的。
首先让你的R脚本接受一个参数,该参数将是脚本的位置。 接下来,您只需要为
创建一个Bash / Batch(一个用于windows和unix)1)获取自己的目录
2)在目录中搜索R脚本(简单* .R搜索)
3)在步骤1中使用自己的目录调用R脚本。
然后,您只需将Bash和Batch脚本打包到您提供给客户端的文件夹中,并要求他们只为其环境运行相关脚本。
理论上,您只需要创建一次Bash / Batch脚本。
编辑:我已经创建了一个适用于此问题的简单bash脚本,请参阅下面的
#!/bin/bash
#Modify the search string to narrow the search
SEARCH_STRING="*.R"
#Get the current directory
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo ${DIR}
#Get the name of the R script
R_SCRIPT=`find $DIR -name ${SEARCH_STRING} -type f -exec basename {} \;`
echo ${R_SCRIPT}
Rscript ${R_SCRIPT} ${DIR}
我不太熟悉Windows Shell,所以你必须自己做这个:P
您可以使用此R脚本进行测试;
options(echo = FALSE) #So we don't get the script echo'd
arguments <- commandArgs(trailingOnly = TRUE) #getting the arguments
working_directory <- arguments[1]
setwd(working_directory)
getwd() #print out to test
答案 3 :(得分:1)
我认为这是Windows。
跟进里卡多的建议:让客户的系统设置为如果双击脚本,则在脚本目录中启动R解释器。您还可以为此行为指定一个特殊扩展名(例如,.Rwd
用于“R脚本设置工作目录”)。然后,您不需要在脚本中setwd()
。
对于初学者,以下命令行脚本可能会执行(未经测试):
pushd %~d1%~p1
R --vanilla < "%1"
将.Rwd
个文件与此脚本相关联。
如果您需要source()
个其他脚本,请考虑使用chdir=T
参数。
答案 4 :(得分:0)