假设我有以下内容:
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]) })
但是它似乎无法正常工作。我要去哪里错了?
答案 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