我想在R中扩展环境变量,就像我在Python中可以做到的那样:
os.path.expandvars('$WHATEVER/hello/world')
但是,同样不适用于path.expand()
path.expand('$WHATEVER/hello/world')
我怎么能这样做?
答案 0 :(得分:0)
str_replace_all
包中的 stringi
允许您提供一个函数来计算替换文本,因此这使我们非常接近。添加自定义正则表达式以获取您要如何提取有效变量引用的方式,并添加一些substr
和getenv
,然后就可以回家了。
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]];
})