【问题标题】:How to get parameters from config file in R script如何从R脚本中的配置文件中获取参数
【发布时间】:2011-03-11 12:25:04
【问题描述】:

有没有办法从 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 脚本、Perl 脚本和 Java 使用单个配置文件?

【问题讨论】:

    标签: r unix


    【解决方案1】:

    我会选择 YAML。与 XML 不同,专为人类可读性而设计。 CRAN 上存在 R 包“yaml”,我确定 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)
    

    根据需要添加尽可能多的部分和参数。亲爱的。

    yaml.load_file 将您的配置作为 R 列表返回,您可以使用 $-notation 访问列表的命名元素。

    【讨论】:

    • 谢谢。我试过这个。但我收到Error: could not find function "yaml.load_file" Execution halted。我已经使用install.packages("yaml", dependencies=TRUE) 在我的 R 安装中安装了 YAML 包,它确实成功完成了。你能帮我解决这个问题吗?
    • @Salman:您在使用library(yaml) 调用yaml.load_file 之前加载了yaml 包吗?
    • 我已经编辑了我的答案来给出这个例子。您应该阅读一篇好的 R 介绍,以便了解一些基础知识 - 不会花太长时间!
    • 非常感谢 Spacedman。实际上,我已经通过了这个方法。 YAML 是一个很好的建议,毫无疑问,我现在正在使用它来跨 Java、Perl 和 R 共享数据库配置。我必须说非常简单易用。
    • 与 Python 也很好玩。我用它来坚持 - 这是有史以来最好的事情!
    【解决方案2】:

    您可以source() 在读取配置文件参数的主脚本顶部添加一个 R 脚本。根据您与谁共享脚本,可能存在数据库安全问题和未加密格式的登录信息。最近有一个关于这个的问题,我会看看我能不能在一分钟内找到它。

    无论如何,将所有 db 参数存储在名为 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 脚本、perl 脚本和 Java 类之间共享相同的配置文件吗?
    • @Salman - 我对 perl 或 Java 了解不多,无法具体回答 - 但我确信这两种语言都能够解析平面文件并从中提取有意义的信息。根据我对 perl 的了解,这正是它的设计目的。抱歉,我无法提供更多详细信息...
    • 然后使用逗号 (,) 分隔文件。 python 有 csv 库,可以毫无问题地读取它,perl 可能也是如此,即使解析这个文件很容易。
    • @Chase - 谢谢。别担心。是否可以在 R 中读取环境变量?我们可以在 Java 和 Perl 中轻松做到这一点。我不想过多地使用文件解析并使用开箱即用的东西。
    • 萨尔曼,请考虑help(Sys.getenv)。环境变量确实可以提供帮助。
    【解决方案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]])
    }
    

    【讨论】:

      【解决方案4】:

      您在这里描述的是对跨系统、平台、语言等通用配置的渴望......

      这是一个很大的话题,并且已经泼了很多墨水。有些人将 XML 视为答案,而另一些人则更喜欢 JSON 等更简单的相关格式。您也可以尝试 Apache 风格的配置文件,因为大多数 语言都有相应的库(但 R 可能是个例外)。

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

      【讨论】:

      • 嗯,是的,也不是。虽然它有来自 Debian 内部的 Perl 代码,但你从哪里获得 Java(根据 OP)?
      • 写一个解析器只需要两分钟。这是 v 简单配置的方便格式
      • 在这种情况下,OP 将很高兴地等待 Java 解决方案在您的 github 帐户上的到来。其他一切都是蒸汽软件,对不起。
      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-24
        • 2011-08-24
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 2014-02-20
        • 2017-03-16
        相关资源
        最近更新 更多