我有一个等式作为字符串,其中字符串等式中的变量是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:]
?
答案 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()
将结果重新转换为字符。