#r #config
#r #конфигурация
Вопрос:
Я пытаюсь использовать библиотеку ConfigParser в R для записи в существующий файл конфигурации. Библиотека указана в CRAN вместе с очень короткой документацией. Я создал фиктивный конфигурационный файл с именем test.ini со следующим содержимым:
[group]
why=1
are=2
you=3
broken=4
и затем я использую следующий R-скрипт для записи в файл конфигурации:
library(ConfigParser)
config <- ConfigParser$new() # Create a config parser
config$read("test.ini")
# create new keys to add to the config file
foo <- c(config$set("foo_key", "foo_value", "group"))
bar <- c(config$set("bar_key", "bar_value", "group"))
config$write("test.ini")
Когда я запускаю скрипт R, результат соответствует ожидаемому:
[group]
bar_key=bar_value
foo_key=foo_value
why=1
are=2
you=3
broken=4
Однако, когда я запускаю его во второй раз, я в конечном итоге создаю дубликаты ключей:
[group]
bar_key=bar_value
foo_key=foo_value
bar_key=bar_value
foo_key=foo_value
why=1
are=2
you=3
broken=4
Это, очевидно, нежелательно. Документация короткая, и я не заметил никаких опций, которые я мог бы пропустить. Я также не видел никаких нерешенных проблем в репозитории GitHub для библиотеки. Я не могу представить, что это упущение со стороны человека, который создал библиотеку, поэтому я, должно быть, что-то упускаю. Буду признателен за любую помощь.
Редактировать:
Я должен был более четко указать вторую запись. Вторая запись может быть законной в результате изменения значения, связанного с ключом. Итак, мой второй запуск должен был выглядеть так:
library(ConfigParser)
config <- ConfigParser$new() # Create a config parser
config$read("test.ini")
# create new keys to add to the config file
foo <- c(config$set("foo_key", "foo_changed", "group"))
bar <- c(config$set("bar_key", "bar_changed", "group"))
config$write("test.ini")
И тогда результаты будут:
[group]
bar_key=bar_changed
foo_key=foo_changed
bar_key=bar_value
foo_key=foo_value
why=1
are=2
you=3
broken=4
В каждом анализаторе файлов конфигурации, о котором я знаю (GLib, python ConfigParser), библиотека будет знать достаточно, чтобы заменить существующее значение, связанное с ключом, на новое значение, А не просто дублировать ключ в файле конфигурации. В этом проблема.
Комментарии:
1. Если вы запустите его n раз, вы добавляете больше целых элементов снова и снова. Может быть, вам нужно
if/else
проверить или прокомментироватьconfig.write
строку
Ответ №1:
Может быть, лучше иметь if/else
проверку
if(is.null(config$data[["group"]][["foo_key"]])) {
# create new keys to add to the config file
foo <- c(config$set("foo_key", "foo_value", "group"))
config$write("test.ini")
}
config$data
Возвращает a list
с key/value
парами. Если ключ отсутствует, значение будет NULL
. Итак, по сути, мы просим записать только if
тот ключ, которого нет
-тестирование
# // initial case
config <- ConfigParser$new()
config$read("test.ini")
config$data
#$group
#$group$why
#[1] "1"
#$group$are
#[1] "2"
#$group$you
#[1] "3"
#$group$broken
#[1] "4"
config$data[["group"]][["foo_key"]]
#NULL
# // Now we add the new key
if(is.null(config$data[["group"]][["foo_key"]])) {
# create new keys to add to the config file
foo <- c(config$set("foo_key", "foo_value", "group"))
config$write("test.ini")
}
# // Run the step again
if(is.null(config$data[["group"]][["foo_key"]])) {
# create new keys to add to the config file
foo <- c(config$set("foo_key", "foo_value", "group"))
config$write("test.ini")
}
# // read it again
config$read("test.ini")
config$data
#$group
#$group$foo_key # added only the first time
#[1] "foo_value"
#$group$why
#[1] "1"
#$group$are
#[1] "2"
#$group$you
#[1] "3"
$group$broken
[1] "4"
Комментарии:
1. Обычным поведением при записи в файлы конфигурации является замена значения, связанного с ключом, если ключ уже существует. Я не думаю, что это поможет?
2. @LeighK в любом случае, это работает для меня. Я также показал результат