Как получить параметры из конфигурационного файла в скрипте R - PullRequest
30 голосов
/ 11 марта 2011

Есть ли способ прочитать параметры из файла в 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?

Ответы [ 4 ]

39 голосов
/ 11 марта 2011

Я бы пошел на 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.

12 голосов
/ 11 марта 2011

Вы можете source() сценарий R в верхней части основного сценария, который читает параметры вашего конфигурационного файла. В зависимости от того, с кем вы делитесь своими сценариями, могут возникнуть проблемы с безопасностью базы данных и наличием информации для входа в незашифрованном формате. Здесь, на SO, недавно возник вопрос об этом, я посмотрю, смогу ли я найти его через минуту.

В любом случае, сохраните все ваши параметры БД в файле с именем 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)
3 голосов
/ 03 мая 2012

Встроенная функция 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]])
}
1 голос
/ 11 марта 2011

То, что вы здесь описываете, - это желание общей конфигурации для систем, платформ, языков, ...

Это большая тема, и на нее было пролито много чернил. Некоторые люди видят XML как ответ, другие предпочитают более простые связанные форматы, такие как JSON. Вы также можете попробовать конфигурационные файлы в стиле Apache, так как большинство языков имеют библиотеки для этого (но R может быть исключением).

Мне нравится Google ProtocolBuffers , которые бывают быстрыми, эффективными, кросс-платформенными, многоязычными, совместимыми с прямой пересылкой ... но имеют один недостаток - не быть ascii файлами (хотя вы можете прочитать сначала файлы ascii, а затем создайте прото файлы). Для R есть пакет RProtoBuf .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...