如何从R脚本中的配置文件中获取参数

时间:2011-03-11 12:25:05

标签: r unix

有没有办法从R脚本中读取文件中的参数?

我想创建一个

的配置文件
db_host=xxxx
db_name=xxxx
db_user=xxxx
db_pass=xxxx

然后在R脚本中使用它来创建数据库连接。

dbConnect(PgSQL(), host="xxxx", dbname="xxxxx", user="xxxx", password="xxxxx")

然后如何在R脚本中使用它。

编辑:我也想知道是否有一种方法可以在R Scripts,Perl Scripts& S中使用单个配置文件。爪哇?

5 个答案:

答案 0 :(得分:38)

我会去YAML。与XML不同,专为人类可读写而设计。 R包“yaml”存在于CRAN上,我确信perl和java包也存在。

http://ftp.heanet.ie/mirrors/cran.r-project.org/web/packages/yaml/index.html

你无法获得比这更多的跨平台:

http://yaml.org/

至少在我写一个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访问列表的命名元素。

答案 1 :(得分:12)

您可以在主脚本顶部的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)

答案 2 :(得分:3)

如果你建议使用等号分割列,内置的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]])
}

答案 3 :(得分:1)

您在此处描述的是对跨系统,平台,语言的常见配置的渴望......

这是一个很大的话题,并且已经有很多墨水泄漏了。有些人认为XML是答案,其他人更喜欢简单的相关格式,如JSON。您也可以尝试Apache样式的配置文件,因为大多数语言都有库(但R可能是个例外)。

我碰巧喜欢Google ProtocolBuffers这是快速,高效,跨平台,多语言,向前兼容......但有一个缺点是不是ascii文件(尽管你可以先读取ascii文件然后创建proto文件)。对于R,有RProtoBuf包。

答案 4 :(得分:0)

如果您使用 INI 配置文件,则可以使用 ini 包。例如:

library(ini)
config <- read.ini('/config/database.ini')

https://cran.r-project.org/web/packages/ini/ini.pdf