获取源文件的文件名和路径

作为文件。
source

d 或者
Sweave

d 可以找到自己的方式吗?

背景:

我工作了很多 .R 脚本或 .Rnw 文件。
我的项目被组织到目录结构中,但项目的基本目录的路径通常在不同的计算机之间变化。 /例如,因为我只是为谁作出一部分数据分析 - 然后是另一个,他们的目录结构与我的不同:我有基本的项目目录 ~/Projects/StudentName/ 或者 ~/Projects/Studentname/Projectname, 大多数只有一个项目的学生通常都有它 ~/Measurements/ 或者 ~/DataAnalysis/ 或者那样的东西不会为我工作/.

因为


setwd /my.own.path ///


它会非常有用,因为它会确保工作目录是项目的基本路径,无论该项目实际上实际上。 没有必要,用户应该考虑设置工作目录。

让我澄清:我正在寻找一个与键盘快捷方式合作的解决方案 editor's/IDE's
source

或者
Sweave

不思考用户。
已邀请:

石油百科

赞同来自:

只是 FYI,
knitr


setwd//

在 dir 输入文件 /而且只有/ 评估代码片段 , 那是如果你打电话
knit/'path/to/input.Rnw'/

, 在职的 dir 将暂时切换到
path/to/

. 如果你想知道入口 dir 在代码的节目中,您目前可以调用一个不可分得的功能
knitr:::input_dir//

/我可以将来导出/.

知食

赞同来自:

从优惠中剥离 Seb gsk3, 这是你的想法:

用户名组合 /login/ 和 IP 或者计算机名称可用于选择所需的目录。

这导致了类似的东西:


setwd /switch /paste /Sys.info // [c /"user", "nodename"/], collapse="."/, 
user.laptop = "~/Messungen",
user2.server = "~/Projekte/Projekt/",
//


因此,有一种自动解决方案

合作
source


合作
Sweave


甚至适用于互动会话,其中字符串行发送命令。

组合
user


nodename

, 当然,必须是混凝土

但是,需要手动编辑路径。

欢迎改善!

更新:

Gabor Grotendic回答了关于相关问题 r-help today 通过以下方式:


this.dir <- dirname/parent.frame/2/$ofile/
setwd/this.dir/


这将适用于
source

.

另一个更新:现在我将在项目中执行大多数关于数据分析的工作。 RStudio. RStudio 基本上解决了问题: RStudio 每次在项目之间切换时都会在项目的根目录中更改工作目录。

所以我可以把项目目录放在目录树上,因为我想要 /学生还可以将副本放在他们想要的地方/, 并同步数据文件和 scripts/
.Rnw

s 使用版本控制 /我们使用私人服务器 git/. 项目文件 RStudio 存储在版本控制系统之外,即
.gitignore

包含
.Rproj.user

.

显然,在

框架

项目目录结构应同步。

石油百科

赞同来自:

您可以使用
sys.calls//

, 获取用于源文件的命令。 然后你需要一个小技巧,使用正则表达式来实现这一方式
source/"something/filename"/

可以使用绝对或相对路径。 以下是第一次尝试将所有部件一起收集:尝试在源文件开头插入以下行。


whereFrom=sys.calls//[[1]]
# This should be an expression that looks something like
# source/"pathname/myfilename.R"/
whereFrom=as.character/whereFrom[2]/ # get the pathname/filename
whereFrom=paste/getwd//,whereFrom,sep="/"/ # prefix it with the current working directory
pathnameIndex=gregexpr/".*/",whereFrom/ # we want the string up to the final '/'
pathnameLength=attr/pathnameIndex[[1]],"match.length"/
whereFrom=substr/whereFrom,1,pathnameLength-1/
print/whereFrom/ # or "setwd/whereFrom/" to set the working directory


不是这样 robust—for 标本,他将失败 windows 从
source/"pathname\\filename"/

, 如果你有一个文件寻找另一个文件,我没有检查会发生什么 file—but, 您可以在此之上构建一个解决方案。

莫问

赞同来自:

我没有直接解决方案如何获取文件本身的目录,但如果您有一个有限的目录和目录结构,您可能会使用


if/file.exists/"c:/somedir"/==TRUE/{setwd/"c:/somedir"/}


您可以检查目录模板,然后安装 dir. 它会帮助你吗?

窦买办

赞同来自:

另一个问题是工作目录是任何脚本可以更改的全局变量,因此如果您的脚本导致另一个脚本,则必须返回 wd 背部。 在 RStudio 我用 Session - > Set Working Directory - > To Source File Location /我知道这并不完美/, 然后我的脚本做到了


wd = getwd //
...
source /"mySubDir/myOtherScript.R", chdir=TRUE/; setwd /wd/
...
source /"anotherSubDir/anotherScript.R", chdir=TRUE/; setwd /wd/


因此,您可以支持堆栈的操作目录。 我希望它以语言本身实施。

江南孤鹜

赞同来自:

这个答案适用于
source

, 以及里面
nvim-R

- 如果他合作,我不知道
knitr

和类似的东西。 欢迎任何反馈意见。

如果你有几种情况
source

-ing 彼此,得到正确的一个很重要。 这是最大的
i

, 对于它存在
sys.frame/i/$ofile

.


get.full.path.to.this.sourced.script = function// { 
for/i in sys.nframe//:1/ { # Go through all the call frames,
# in *reverse* order.
x = sys.frame/i/$ofile
if/!is.null/x// # if $ofile exists,
return/normalizePath/x// # then return the full absolute path
}
}

要回复问题请先登录注册