解决格式化程序字符串

时间:2019-01-28 19:00:57

标签: r regex

假设我有以下内容:

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 :(得分:5)

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

答案 1 :(得分:2)

要回答您的实际问题,请使用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")

我完全按照您的预期。

答案 2 :(得分:1)

我们可以使用gsubfn来替换键/值对,以将pattern更改为'value'

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

注意:“ value.list”是vector而不是list