在路径中展开环境变量

时间:2017-03-31 10:09:31

标签: r

我想在R中扩展环境变量,就像我在Python中可以做到的那样:

os.path.expandvars('$WHATEVER/hello/world')

但是,同样不适用于path.expand()

path.expand('$WHATEVER/hello/world')

我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

str_replace_all包中的

stringi允许您提供一个函数来计算替换文本,因此这使我们非常接近。添加自定义正则表达式以获取您要如何提取有效变量引用的方式,并添加一些substrgetenv,然后就可以回家了。

library(stringr)
expand <- function(params) {
    str_replace_all(
        params, 
        '\\$[A-Za-z_0-9]+', 
        function(s) Sys.getenv(substr(s, 2, str_length(s))))
}

或者,对于${...}样式变量:

library(stringr)
expand <- function(params) {
    str_replace_all(
        params, 
        '\\$\\{[^{}]+\\}', 
        function(s) Sys.getenv(substr(s, 3, str_length(s)-1)))
}

最后,一个版本会首先检查R变量,如果找不到则回退到环境变量:

.osEnv <- Sys.getenv()
# Coalesce
`%?%` <- function(a, b) {
    n <- is.null(a);
    if (any(n)) a[n] <- b[n];
    a;
}
expand <- function(params)
    str_replace_all(params, '\\$\\{([^{}]+)\\}',
                    function(s) {
                        name <- substr(s, 3, str_length(s) - 1);
                        val <- get0(name) %?% .osEnv[[name]];
                    })