Разрешение строки форматирования - PullRequest
0 голосов
/ 28 января 2019

Предположим, у меня есть следующее:

format.string <- "@AB@-@BC@/@DF@" #wanted to use $ but it is problematic
value.list <- c(AB="a", BC="bcd", DF="def")

Я хотел бы применить value.list к format.string, чтобы заменить названное значение.Так что в этом примере я должен получить строку: a-bcd/def

Я попытался сделать это следующим образом:

  resolved.string <- lapply(names(value.list), 
       function(x) { 
         sub(x = save.data.path.pattern, 
             pattern = paste0(c("@",x,"@"), collapse=""),
             replacement = value.list[x]) })

Но, похоже, он работает неправильно.Куда я иду не так?

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Пакет glue предназначен для этого.Вы можете изменить открывающий и закрывающий разделители, используя .open и .close, но они должны быть разными.Также обратите внимание, что value.list должен быть либо списком, либо фреймом данных:

library(glue)

format.string <- "{AB}-{BC}/{DF}"
value.list <- list(AB="a", BC="bcd", DF="def")

glue_data(value.list, format.string)
# a-bcd/def
0 голосов
/ 28 января 2019

Чтобы ответить на ваш фактический вопрос, используя lapply над names(value.list), вы, как показывает ваш вывод, берете каждый из элементов value.list и выполняете замену.Однако все это происходит независимо, т. Е. Замены в конечном итоге не объединяются в один результат.

Чтобы сделать что-то очень похожее на ваш подход, мы можем использовать Reduce, который выполняет именно это объединение:

Reduce(function(x, y) sub(paste0(c("@", y, "@"), collapse = ""), value.list[y], x),
      init = format.string, names(value.list))
# [1] "a-bcd/def"

Если мы вызываем анонимную функцию f, то результат будет

f(f(f(format.string, "A"), "B"), "C")

именно так, как вы и предполагали, я считаю.

0 голосов
/ 28 января 2019

Мы можем использовать gsubfn, который может заменить пару ключ / значение, чтобы заменить pattern на 'value'

library(gsubfn)
gsub("@", "", gsubfn("[^@]+", as.list(value.list), format.string))
#[1] "a-bcd/def"

ПРИМЕЧАНИЕ: 'value.list' - это vector а не list

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