#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]]
)