我正在编写一些代码,将数学函数定义转换为有效的R代码。因此,我使用deparse(substitute))
来访问这些函数定义,以便我可以将它们更改为有效的R代码。
例如,我有一个函数LN(x)^y
,应该变成log(x)^y
。我可以使用第一个版本的to_r
函数来实现这一点:
to_r <- function(x) {
parse(text = gsub("LN", "log", deparse(substitute(x))))
}
to_r(LN(x)^y)
这将返回表达式log(x)^y
,符合我的预期。
我也可以得到类似于LN("x a")^y
的函数定义。要处理这些,我可以扩展我的函数:
to_r_2 <- function(x) {
parse(text = gsub(" ", "_", gsub("\"", "", gsub("LN", "log", deparse(substitute(x))))))
}
to_r_2(LN("x a")^y)
这里返回的是 expression(log(x_a)^y)
,没问题。
但是,当我的输入变成 LN("x a")*2^y
时,会失败:
parse(text = gsub(" ", "_", gsub("\"", "", gsub("LN", "log", deparse(substitute(LN("x a")*2^y))))))
出现错误是因为
deparse(substitute(LN("x a")*2^y))
在*
周围引入了空格,然后我用gsub
将这些空格替换为下划线,这对于parse
来说是个问题。
有没有解决方法?也许有deparse(substitute)
的替代方案?
(显而易见的是:用gsub(" ", "", x)
替换gsub(" ", "_", x)
不是一个真正的选择,因为变量名会变得难以阅读。例如, Something 的原因之一
将变成Something的原因之一
,这比尝试的Something_原因_之_一
更难以阅读。)
to_r(LN(x)^y)
这样的调用,请参见我的编辑。 - symbolrushto_r_2(LN(x a)^y)
。如果您正在传递一个表达式,它需要使用有效的 R 语法。您如何知道他们实际上是在尝试将字符串传递给您的函数?您想要用符号替换每个字符串吗? - MrFlickto_r_2(LN(x a)^y
将永远不起作用。我已将其删除。仍然有办法处理to_r_2(LN("x a")*2^y
案例吗? - symbolrushrapply
的一个完美用例,但不幸的是它不能将调用视为列表...虽然这本来很好...rapply(x,function(x) as.symbol(gsub(" ","_",x)), "character", how = "replace")
- moodymudskipper