我想将当前文件位置作为工作目录。
使用Rstudio(Works!):
# Author : Bhishan Poudel
# Program : writehere.r
# Source : Rscript writehere.r
# set working directory here
this.dir <- dirname(parent.frame(2)$ofile) # frame(3) also works.
setwd(this.dir)
# Sample data to test this code
mydata <- seq(1:10)
write.csv(mydata,"writehere.dat")
#This works flawlessly in MacOS 10.9 and Ubuntu 15.1.
使用终端命令:Rscript writehere.r(不起作用!)
Error in dirname(parent.frame(2)$ofile) :
a character vector argument expected
Execution halted
------------------
(program exited with code: 1)
使用终端命令:Rscript writehere.r(立即使用!)
# Author : Bhishan Poudel
# Program : writehere.r
# Source : Rscript example.r
# set working directory here
this_dir <- function(directory)
setwd( file.path(getwd(), directory) )
# Sample data to test this code
mydata <- seq(1:10)
write.csv(mydata,"writehere.dat")
在〜/ .Rprofile里面使用Rstudio(Works!)中的函数:,
##############################################
# inside ~/.Rprofile
# set up working directory
setwd_thisdir <- function () {
this.dir <- dirname(parent.frame(3)$ofile)
setwd(this.dir)
}
##############################################
然后,在任何目录中,让我们说我有一个文件writehere.r,现在它可以工作了。
# Author : Bhishan Poudel
# Program : writehere.r
# Compile : Rscript writehere.r
# set working directory here
setwd_thisdir
# Sample data to test this code
mydata <- seq(1:10)
write.csv(mydata,"writehere.dat")
问题: 为什么功能
this.dir <- dirname(parent.frame(2)$ofile) # frame(3) also works.
setwd(this.dir)
对Rstudio以外的文本编辑器不起作用吗?
以下是一些有用的链接:
R setting working directory to source file location?
R command for setting working directory to source file location
get filename and path of `source`d file
setwd() in the current working dir
Command for "Set working directory to source file location"
SublimeText and R: Setting Current File Directory
Setting working directory through a function
What is a fool-proof way of permanently setting R working directory?
R setting working directory to source file location?
How to get into the directory of a file in R?
答案 0 :(得分:1)
尝试在您的函数中使用parent.frame(3)
:
setwd_thisdir <- function () {
this.dir <- dirname(parent.frame(3)$ofile)
setwd(this.dir)
}
请参阅?parent.frame
或http://adv-r.had.co.nz/Environments.html#calling-environments。
您还可以查看chdir
函数的source
选项(?source
)。
答案 1 :(得分:1)
更新:我意识到这个答案根本没有帮助,我会发布另一个能够解决这个问题的答案。
就你想要运行的代码不需要任何其他参数而言,如下所示的解决方案,使用eval(expr, envir)
可能会有所帮助。
使用print(environment())
考虑以下示例,在命令行上使用时应返回environment: R_GlobalEnv
。函数test_1
将打印有关调用函数时创建的内部环境的信息,而函数test_2
将返回所需的结果。
test_1 <- function(){
print(environment())
}
test_2 <- function(){
.expr <- quote({
print(environment())
})
.envir <- sys.frame(which = -1)
eval(expr = .expr,
envir = .envir)
}
sys.frame(which = -1)
确保在调用函数的环境中计算表达式。如果您确定始终想要使用全局环境,那么使用.GlobalEnv
会更好。引用您想要使用的表达式也很重要,否则它可能无法正常工作。
此解决方案的一个很好的功能是,您不需要调整要放入函数的代码,只需引用它即可。
最后:可以扩展这种方法,以便您的函数可以获取参数,然后将该参数提供给您想要在另一个环境中评估的代码。然而,这需要对要评估的表达式进行一些非平凡的调整;您可能需要使用bquote
+ .()
构造 - 此外,您还可能需要使用call
和do.call
。
答案 2 :(得分:1)
我给出的第一个答案完全错过了这一点,因为我没有 密切关注你想要达到的目标。解决方案 这里介绍的应该是诀窍。
首先请注意,source
的参数chdir
在帮助文件中描述为:logical;如果TRUE
和file
是路径名,则R工作目录会暂时更改为包含file
的目录以进行评估。
每次要获取文件时手动指定该参数
将是一个痛苦,所以让我们添加一些东西来改变.Rprofile
chdir
从FALSE
到TRUE
的默认值。
formals
- 函数可用于修改默认值
值,但在用于属于其他函数的函数时
在环境中,结果将是创建函数的本地副本。那还不够好。
可能有几种方法可以解决这个问题,但以下几点
当我将它插入.Rprofile时,source
的小黑客为我做了诀窍。
.temporary_copy_source <- base::source
formals(.temporary_copy_source)$chdir <- TRUE
utils::assignInNamespace(
x = "source",
value = .temporary_copy_source,
ns = environment(source))
rm(.temporary_copy_source)
警告:此处介绍的方法原则上可以 允许用户修改任何参数中的任何参数的默认值 功能,但这是一个非常糟糕的主意。保持 请记住,您的脚本可能稍后会与某人共享 你没有相同的.Rprofile。 永远不要写 需要对名称空间进行此类修改的代码!
答案 3 :(得分:1)
简单地,使用rstudio API,提取其目录,并将其设置为工作目录,如下所示:
setwd(dirname(rstudioapi::getSourceEditorContext()$path))
验证是否通过以下命令正确设置了目录:
getwd()
答案 4 :(得分:0)
我写了另一个答案因为你改变了你的问题。有两个有用的事实:
ofile
是source
函数环境中的变量,因此只有在使用source
函数运行某些脚本时才能使用它。所以,评论你的意见:
source
功能),则为是,但是如果按运行(仅运行R控制台中的命令)则不会。< / LI>
ofile
的情况下正在寻找source
。this_dir <- function(directory) setwd( file.path(getwd(), directory) )
是不必要的,因为它只是名为this_dir
的函数的定义。setwd_thisdir
是不必要的,因为它只是将setwd_thisdir
的主体打印到控制台。总结setwd(dirname(parent.frame(2)$ofile))
是一个有用的技巧,当您使用source
函数来源脚本,但无权访问source
函数选项时:在R-Studio中按 Source 时。如果可能,请使用source
函数和chdir=TRUE
。如果您运行脚本,终端只需将终端设置为脚本文件夹。