以JavaScript样式创建R列表作为配置对象

以JavaScript样式创建R列表作为配置对象,r,configuration,this,config,R,Configuration,This,Config,我需要一个config对象来保存我的R代码中使用的一些常量。这些是远程文件的url、保存下载文件的目录、下载后使用的本地文件名等。 我是R新手,这就是为什么我决定使用类似JavaScript的配置对象(尤其是列表),类似于以下内容: var config = { wd : "/some/working/dir", zipSrc : "http://www.example.com/remote_data_file.zip", data_dir

我需要一个config对象来保存我的R代码中使用的一些常量。这些是远程文件的url、保存下载文件的目录、下载后使用的本地文件名等。 我是R新手,这就是为什么我决定使用类似JavaScript的配置对象(尤其是列表),类似于以下内容:

var config = {
    wd           : "/some/working/dir",
    zipSrc       : "http://www.example.com/remote_data_file.zip",
    data_dir     : "data",
    data_zip     : "data.zip",
    data_txt     : "data.txt",
    abs_data_dir : this.wd + this.data_dir,
    abs_data_zip : this.abs_data_dir + this.data_zip,
    abs_data_txt : this.abs_data_dir + this.data_txt
};
请注意,可以使用“this”引用当前对象,并在其内部进行一些计算/赋值

我在R到达的最远的地方是:

config <- list(wd           = getwd(),
               zipSrc       = "http://www.example.com/remote_data_file.zip",
               data_dir     = "data",
               data_zip     = "data.zip",
               data_txt     = "data.txt")

config解决方案1

中,我在玩了一会儿之后想到了这一点:

config = rev(within(list(), {
   wd           = "/some/working/dir"
   zipSrc       = "http://www.example.com/remote_data_file.zip"
   data_dir     = "data"
   data_zip     = "data.zip"
   data_txt     = "data.txt"
   abs_data_dir = file.path(wd, data_dir)
   abs_data_zip = file.path(abs_data_dir, data_zip)
   abs_data_txt = file.path(abs_data_dir, data_txt)
}))

config
# $wd
# [1] "/some/working/dir"

# $zipSrc
# [1] "http://www.example.com/remote_data_file.zip"

# $data_dir
# [1] "data"

# $data_zip
# [1] "data.zip"

# $data_txt
# [1] "data.txt"

# $abs_data_dir
# [1] "/some/working/dir/data"

# $abs_data_zip
# [1] "/some/working/dir/data/data.zip"

# $abs_data_txt
# [1] "/some/working/dir/data/data.txt"
您可以将其转换为一个函数:

list.eval <- function(...) rev(within(list(), ...))

这可能不如flodel的解决方案美观,但您可以使用环境而不是列表,例如:

mk_config <- function (expr) {
    env <- new.env()
    evalq(expr, envir = env)
    function (s) get(s, envir = env)
}
这样做的一个可能优点是,如果您缺少一个键而不是返回
NULL
,则
get
会失败并出现错误:

CF(abs_data_txt)

## [1] "/some/working/dir/data/data.txt"

CF(abs_dtaa_txt)

## Error in get(s, envir = env) (from cf.R#4) : object 'abs_dtaa_txt' not found
## Calls: CF -> CF_ -> get
您还可以使用以下命令从文件加载配置选项

local(source('config.R', local = TRUE), envir = env)

对于新手来说,解决方案1似乎更简单、更容易理解。谢谢你,弗洛德尔,非常感谢!闭包用法的一个很好的例子!谢谢你,塞缪尔!
CF(abs_data_txt)

## [1] "/some/working/dir/data/data.txt"

CF(abs_dtaa_txt)

## Error in get(s, envir = env) (from cf.R#4) : object 'abs_dtaa_txt' not found
## Calls: CF -> CF_ -> get
local(source('config.R', local = TRUE), envir = env)