获取`source`d文件的文件名和路径

cbe*_*ica 18 r sweave

sourced或Sweaved文件如何找到自己的路径?

背景:

我使用.R脚本或.Rnw文件工作了很多.我的项目是在一个目录结构中组织的,但是项目基本目录的路径经常在不同的计算机之间变化(例如,因为我只为其他人做了部分数据分析,他们的目录结构与我的不同:我有项目基目录〜/ Projects/StudentName /或〜/ Projects/Studentname/Projectname和大多数只拥有一个项目的学生通常在〜/ Measurements /或〜/ DataAnalysis /或类似的东西下 - 这对我不起作用).

所以像一条线

    setwd (my.own.path ()) 
Run Code Online (Sandbox Code Playgroud)

将是非常有用的,因为它将允许确保工作目录是项目的基本路径,无论该项目实际在哪里.无需用户必须考虑设置工作目录.

让我澄清一下:我寻找的解决方案可以按下不假思索的用户的编辑器/ IDE sourceSweave键盘快捷键.

Yih*_*Xie 12

仅供参考,knitrsetwd()在(并且仅在)评估代码块时输入文件的目录,即如果您调用knit('path/to/input.Rnw'),则工作目录将暂时切换到path/to/.如果你想知道代码块中的输入目录,目前你可以调用一个未导出的函数knitr:::input_dir()(我将来可以导出它).

  • @Ruben这是对的.RStudio启动一个新的非交互式R会话来编译您的文档,这与您当前的交互式R会话无关.`knitr ::: input_dir()`只能_inside_一个文件(不够吗?); 一旦`knitr`退出,它就消失了. (2认同)
  • @Yihui我认为在没有求助于IDE的情况下,在交互式会话中从R中获取文件目录可能是不可能的.对于我的工作流程,这不是一个大问题,但如果我想向同事发送/离开文件,他们应该无法搞砸,如果他们只是打开目录中的文件并执行所有代码.不幸的是,随着工作目录有时持续存在,他们可以并且愿意.我的同事不在"使用R脚本打开其他R脚本"级别 - 我很高兴如果他们保存脚本而不是依赖它来恢复.SPSS的习惯. (2认同)

cbe*_*ica 11

从gsk3的Seb的建议开始,这是一个想法:

  • 用户名(登录)和IP或计算机名称的组合可用于选择正确的目录.

这导致类似于:

    setwd (switch (paste (Sys.info () [c ("user", "nodename")], collapse="."), 
           user.laptop  = "~/Messungen",
           user2.server = "~/Projekte/Projekt/",
           ))
Run Code Online (Sandbox Code Playgroud)

所以有一个自动解决方案

  • 与...合作 source
  • 与...合作 Sweave
  • 甚至适用于逐行发送命令的交互式会话

  • 的组合usernodename当然需要是特定

  • 但是,这些路径需要手工编辑.

欢迎改进!


更新:

Gabor Grothendieck今天就r-help的相关问题回答了以下问题:

this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)
Run Code Online (Sandbox Code Playgroud)

这将适用于source.


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

因此,我可以将项目目录放在我想要的目录树中(并且学生也可以将他们的副本放在他们想要的任何地方)并.Rnw通过版本控制同步数据文件和脚本(我们使用私有git服务器).RStudio项目文件不受版本控制,即.gitignore 包含.Rproj.user.

显然,项目中,需要同步目录结构.