有没有办法从R脚本中的文件读取参数?
我想创build一个configuration文件
db_host=xxxx db_name=xxxx db_user=xxxx db_pass=xxxx
然后在R脚本中使用它来创build数据库连接。
dbConnect(PgSQL(), host="xxxx", dbname="xxxxx", user="xxxx", password="xxxxx")
然后如何在R脚本中使用它。
编辑:我也想知道是否有一种方法,我可以在R脚本,Perl脚本和Java使用一个单一的configuration文件?
我会去YAML。 与XML不同,专为人类读写而设计。 R包中存在“yaml”,我相信perl和java包也存在。
http://ftp.heanet.ie/mirrors/cran.r-project.org/web/packages/yaml/index.html
你不能得到比这更多的跨平台:
至少在我写一个YAML FORTRAN包的时候
[编辑]
例。 假设你有config.yml:
db: host : foo.example.com name : Foo Base user : user453 pass : zoom
然后yaml.load_file(“config.yml”)返回:
$db $db$pass [1] "zoom" $db$user [1] "user453" $db$name [1] "Foo Base" $db$host [1] "foo.example.com"
所以你也是:
library(yaml) config = yaml.load_file("config.yml") dbConnect(PgSQL(), host=config$db$host, dbname=config$db$name, user=config$db$user, password=config$db$pass)
根据需要添加尽可能多的部分和参数。 Sweeeeyit。
yaml.load_file将您的配置作为R列表返回,您可以使用$ -notation访问列表的已命名元素。
你可以在你的主脚本的顶部输入source()
一个R脚本来读取你的配置文件参数。 根据您与谁共享脚本,数据库安全性可能存在问题,登录信息以未加密格式存在。 关于这个,最近有一个关于这个问题的问题,我会看看我能否在一分钟内找到答案。
总之,将所有数据库参数存储在名为config.R
的文件中,然后在主脚本上运行:
source("config.R") #Will create four objects named "db_host, db_name, db_user, db_pass" dbConnect(PgSQL(), host=db_host, dbname=db_name, user=db_user, password=db_pass)
如果你建议使用等号拆分列,那么内建的R函数read.table可以很好地处理这种INI格式。
key.val<-read.table(filename, sep="=", col.names=c("key","value"), as.is=c(1,2))
如果您想要更传统的INI行为,以便您可以使用多个配置文件,请尝试将键值对分配给R环境。 例如:
read.config<-function(filename) { conf.vars<-new.env() for (f in filename) { if (file.exists(f)) { header<-1 key.val<-read.table(f, sep="=", col.names=c("key","value"), skip=header, as.is=c(1,2)) for (kidx in seq(length(key.val$key))) { assign(key.val[["key"]][kidx], key.val[["value"]][kidx], envir=conf.vars) } } } return(conf.vars) } get.config<-function(name) { kv.env=read.config(c("project.cfg","project_local.cfg")) return(kv.env[[name]]) }
你在这里描述的是一个系统,平台,语言, 通用配置的愿望…
这是一个很大的话题,在这方面已经流传了很多墨水。 有些人认为XML是答案,其他人更喜欢简单的相关格式,如JSON。 你也可以尝试Apache风格的配置文件,因为大多数语言都有它的库(但是R可能是个例外)。
我碰巧喜欢Google协议缓冲区 ,它是快速,高效,跨平台,多语言,向前兼容…但有一个缺点是不ascii文件(虽然你可以先读取ascii文件,然后创建原始文件) 。 对于R,有RProtoBuf包。