【问题标题】:Set a global path variable that all functions use to save files to R设置所有函数用于将文件保存到 R 的全局路径变量
【发布时间】:2018-10-18 08:53:10
【问题描述】:

我有一个简单的问题,我找不到简单的解决方案。我正在将 R 用于数据分析管道,并且我想将输出路径设置为全局变量。然后,各种功能应使用它来保存表格和绘图。我想避免将这个路径变量传递给每个函数。所以我所做的如下:

outpath <- "../results/"
function1 <- function(){
    ... # analysis
    write.table(result, file = paste0(outpath,"/function1results.xls"))
    }

如果我在 Rstudio 中使用工作环境中的 outpath 变量调用 function1(),这运行良好。但是,如果我想使用“Rscript”在另一个工作站上运行整个脚本,我会收到以下错误:

as.vector(x, "character") 中的错误:

无法将类型“闭包”强制转换为“字符”类型的向量

我假设我搞砸了 R 处理环境的方式。也许有人比我更了解:)

编辑:我在本地机器上运行 windows 而工作站运行 linux 可能很有趣。

【问题讨论】:

  • 该错误(来自paste0())告诉您outpath 未在环境中定义。即它丢失了,或者不在全局环境中,或者你在函数中使用了错误的变量名。
  • 加上@hrbrmstr 所说的,您的paste0 将产生“../results//function1results.xls”。您的路径可能实际上没有双斜杠

标签: r file output rscript


【解决方案1】:

相对路径是灾难的根源,尤其是当 R 脚本不是从所有系统上的完全相同的位置运行时。

如果你确定——100%确定——这个脚本将总是从一个一致的位置运行,那么你可以放:

outpath_prefix <- "../results/"

在脚本顶部并使用file.path() 函数以与平台无关的方式将路径连接在一起:

file.path(outpath_prefix, "function1results.xls")

阅读该功能的帮助页面 (?file.path),专门针对此 gem:

该实现被设计为快速(比粘贴更快),因为此函数在 R 本身中被广泛使用。

但是

考虑使用“项目”概念并安装here 包。

要么使用适当的“项目”(即 RStudio 定义的标准),将“project-name.Rproj”放在项目的根目录中,要么在项目根目录中创建这些文件之一(它们可以为空) :

- `.here` 
- `.projectile`

或对项目使用版本控制(这总是一个好主意)并确保.git文件位于项目的根目录中。 p>

那么你可以这样做:

outpath_prefix <- here::here("results")

在项目目录中 any 脚本的顶部 无论深度如何 并且仍然这样做:

file.path(outpath_prefix, "function1results.xls")

为输入/输出获取与平台无关、不易出错且生成速度更快的路径规范。

【讨论】:

  • 我知道可能存在的问题。但是,我正在使用我在脚本中创建的文件夹的相对路径。无论我在哪里运行脚本,这都不应该改变。我将尝试 file.path 功能。编辑:file.path() 中的错误:缺少参数“outpath_prefix”,没有默认值
  • @hrbrmstr,我们如何修改它,只设置输出路径,而不设置名称?由于某些函数已经有一个预定义的文件名要保存,特别是“climatol”包中的函数,使用了homogen和daily2climatol函数。并且在文档中,没有包含任何参数来指定输出路径。对不起,如果这听起来很无聊,我来自 python 并且只对这个特定的包使用 R 并且无法弄清楚。
【解决方案2】:

将输出路径放入函数中

outpath <- "../results/"

function1 <- function(out){
    ... # analysis
    write.table(result, file = paste0(out,"/function1results.xls")
}

function1(outpath)

【讨论】:

  • 这确实有效,但我试图避免这种情况。我想过使用一个应该可以从函数内部访问的全局变量。
  • 如果你真的必须这样做,你可以尝试使用&lt;&lt;-,即a &lt;&lt;- "new"或assign("a", "new", envir = .GlobalEnv)。
猜你喜欢
  • 2015-01-13
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多