2

有没有办法在 R 中扩展波浪号和环境变量?

例如,在 Python 中,您可以通过编写以下代码集来获取它:

import os
os.path.expanduser("~/r_workspace") # return "/Users/yourname/r_workspace" (in OS X)
os.path.expandvars("$R") # return "/Users/yourname/r_workspace", if you set "$R" to it in advance

R是否提供了这种功能?我不想费心编写以下代码:

read.csv("/Users/myname/python_workspace/subdirectory_1/subdirectory_2/data.csv")
4

2 回答 2

4

基本上一样!

path.expand("~")
#[1] "/Users/Simon"

path.expand将通过用用户的主目录(如果在该平台上定义)替换前导波浪号来扩展路径名。

Sys.getenv()获取系统上定义的环境变量的值,例如

#  Path to R home directory
Sys.getenv( "R_HOME" )
#[1] "/Library/Frameworks/R.framework/Resources"

# Path to default R library
Sys.getenv("R_LIBS")
#[1] "~/R64Libs"

要查看可用的环境变量...

head( names(Sys.getenv()) )
#[1] "__CF_USER_TEXT_ENCODING"    "Apple_PubSub_Socket_Render" "Apple_Ubiquity_Message"    
#[4] "COMMAND_MODE"               "DISPLAY"                    "EDITOR"    

定义一个新的环境变量

要设置环境变量以使其始终对 R 可用,您需要在一个名为的文件中设置该变量,该文件.Renviron默认位于您的{$HOME}目录中。因此,例如为了使环境变量R_WORKSPACE可用,我添加了这一行

R_WORKSPACE = ~/Documents/R/StackOverflow

/Users/Simon/.Renivron. 然后当我加载 R 时,你会看到路径扩展是自动完成的......

#  Clean workspace - commented out so you don't wipe your session!
#  rm( list = ls() )

#  See that variable is now available in R
Sys.getenv( "R_WORKSPACE" )
[1] "~/Documents/R/StackOverflow"

请参阅此处的答案以获取更多信息和选项。

于 2013-09-07T05:01:28.863 回答
1

一个更通用的解决方案是将所有环境变量展开到一个专用的 R 环境中,并使用glue插入感兴趣的字符串。

require(purrr)
require(glue)


interp_from_env = function(path){
    e <- new.env()
    env = Sys.getenv()

    paste0(make.names(names(env)), "='", gsub("'", '', env), "'") %>%
        map(~eval(parse(text=.), envir=e))

    glue::glue(path, .envir=e, .open="${")
}

#usage examples
read.delim(interp_from_env("${PRJ_DATA}/foo.txt") )
source(interp_from_env("${HOME}/bar.R"))
于 2017-09-15T13:22:16.840 回答