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