Конфигурационный файл в формате csv (или txt)

#r

#r

Вопрос:

Я хочу создать конфигурационный файл. В R-файле это будет выглядеть следующим образом:

 #file:config.R
min_birthday_year <- 1920
max_birthday <- Sys.Date() %m % months(9)
min_startdate_year <- 2010
max_startdate_year <- 2022
 

И в основном скрипте я бы сделал: source("config.R") .

Однако теперь я хочу получить данные конфигурации из файла .csv. У кого-нибудь есть идеи, как это сделать? Файл также может быть в формате .txt

Комментарии:

1. Мне интересно: почему именно? Разве изменение csv-файла не будет таким же сложным, как изменение R-файла? Перевод thinks в альтернативный формат может только затруднить его чтение.

2. Я знаю, но скажите это моему менеджеру

3. хорошо, пришлите мне его адрес электронной почты

4. sadistic@jackass.com

5. эй, это мой адрес электронной почты! 😉 Но если серьезно, как бы вы (или, возможно, он) представили форматирование CSV или TXT? Если он хочет чего-то другого, он должен прийти с надлежащим описанием требований.

Ответ №1:

Первое, что я бы посоветовал, это заглянуть в пакет конфигурации. Он позволяет указывать переменные в текстовом файле yaml. Я не использовал его, но он кажется довольно аккуратным и выглядит так, как будто это может быть хорошим решением.

Если вы не хотите его использовать, тогда, если ваш csv выглядит примерно так, с именами переменных в одном столбце и значениями в следующем:

 min_birthday_year,1920
max_birthday,Sys.Date() %m % months(9)
min_startdate_year,2010
max_startdate_year,2022
 

тогда вы могли бы сделать что-то вроде этого:

 # Read in the file
# assuming that names are in one column and values in another
# will create vars using vals from second col with names from first

config <- read.table("config.csv", sep = ",")

# mapply with assign, with var names in one vector and values in the other
# eval(parse()) call to evaluate value as an expression - needed to evaluate the Sys.Date() thing. 
# tryCatch in case you add a string value to the csv at some point, which will throw an error in the `eval` call

mapply(
  function(x, y) {
    z <- tryCatch(
      eval(parse(text = y)),
      error = function(e) y
    )
    assign(x, z, inherits = TRUE)
  },
  config[[1]],
  config[[2]]
)