R 解析格式化程序字符串

R 解析格式化程序字符串,r,regex,R,Regex,假设我有以下几点: format.string <- "@AB@-@BC@/@DF@" #wanted to use $ but it is problematic value.list <- c(AB="a", BC="bcd", DF="def") resolved.string <- lapply(names(value.list), function(x) { sub(x = save.data.path.pattern,

假设我有以下几点:

format.string <- "@AB@-@BC@/@DF@" #wanted to use $ but it is problematic
value.list <- c(AB="a", BC="bcd", DF="def")
  resolved.string <- lapply(names(value.list), 
       function(x) { 
         sub(x = save.data.path.pattern, 
             pattern = paste0(c("@",x,"@"), collapse=""),
             replacement = value.list[x]) })
但它似乎工作不正常。我哪里出错了?

我们可以使用gsubfn,它可以将密钥/值对作为替换,以“值”更改模式

library(gsubfn)
gsub("@", "", gsubfn("[^@]+", as.list(value.list), format.string))
#[1] "a-bcd/def"
注意:“value.list”是一个向量而不是列表

我们可以使用gsubfn,它可以将键/值对替换为“value”来更改模式

library(gsubfn)
gsub("@", "", gsubfn("[^@]+", as.list(value.list), format.string))
#[1] "a-bcd/def"
注意:'value.list'是一个向量,而不是一个列表

胶水包就是为此而设计的。您可以使用.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
胶水包装就是为此而设计的。您可以使用.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

要回答实际问题,请使用lappy over namesvalue.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")

我相信这正是您想要的。

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

我相信这正是你想要的。

我对问题进行了一些更新。有没有办法不使用[a-Z],因为我的命名向量是实际名称。@丹尼斯我根据示例更改了模式。我稍微更新了问题。有没有办法不使用[a-Z],因为我的命名向量是实际名称。@丹尼斯,我根据示例更改了模式。我喜欢这个解决方案!这不是使用了与OP的原始字符串不同的字符串吗code@akrun当然可以,但从我所知道的,OP只是试图用value.list替换分隔符中的任何内容,而不管分隔符是什么。他的评论暗示了这一点,他想使用美元,但事实并非如此problematic@avid_useR是的,你是对的。这只是一个样本。很好!我喜欢这个解决方案!这不是使用了与OP的原始字符串不同的字符串吗code@akrun当然可以,但从我所知道的,OP只是试图用value.list替换分隔符中的任何内容,而不管分隔符是什么。他的评论暗示了这一点,他想使用美元,但事实并非如此problematic@avid_useR是的,你是对的。这只是一个样本。很好!很好知道未来使用!谢谢你,很高兴知道以后使用!非常感谢。