代码之家  ›  专栏  ›  技术社区  ›  Denis

解析格式化程序字符串

  •  1
  • Denis  · 技术社区  · 6 年前

    假设我有以下几点:

    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 回复  |  直到 6 年前
        1
  •  5
  •   acylam    6 年前

    这个 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
    
        2
  •  2
  •   Julius Vainora    6 年前

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

    我相信这正是你想要的。

        3
  •  1
  •   akrun    6 年前

    我们可以使用 gsubfn pattern

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

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