在[:punct:]上拆分字符串,但R

时间:2015-06-19 19:36:27

标签: regex r math strsplit

我有一个等式作为字符串,其中字符串等式中的变量是R工作空间中的变量。我想用R工作区中的数值替换每个变量。当变量名称不包含标点符号时,这很容易。

这是一个简单的例子。

x <- 5
y <- 10
yy <- 15
z <- x*(y + yy)
zAsChar <- "z=x*(y+yy)"
vars <- unlist(strsplit(zAsChar, "[[:punct:]]"))
notVars <- unlist(strsplit(zAsChar, "[^[:punct:]]"))
varsValues <- sapply(vars[vars != ""], FUN=function(aaa) get(aaa))
notVarsValues <- notVars[notVars != ""]
paste(paste0(varsValues, notVarsValues), collapse="")

这会产生"125=5*(10+15)",这很棒。

但是,我希望在变量名中使用下划线,以便我可以使用“下标”作为变量名。我在R markdown中使用数学模式中的这些字符串。

所以我需要一个排除[:punct:]的{​​{1}}。我尝试使用_而不是[\\+\\-\\*\\/\\(\\)\\=],但是通过这种方法,我无法拆分减号。有没有办法保留[:punct:]

2 个答案:

答案 0 :(得分:3)

而不是[:punct:]使用unicode字符类\pP \p{P}的快捷方式)及其否定\PP来执行此操作:

[^\\PP_]

(适用于perl=TRUE选项)

答案 1 :(得分:1)

你确定你需要做所有这些字符串操作吗? substitute()功能可以帮助您

substitute(z==x*(y+yy), list(x=x, y=y, yy=yy,z=z))

或者如果你真的需要以字符值开头

do.call("substitute", list(parse(text=zAsChar)[[1]],list(x=x, y=y, yy=yy,z=z)))
# 125 = 5 * (10 + 15)

您可以deparse()将结果重新转换为字符。