R-从字符串创建函数

R-从字符串创建函数,r,expression,R,Expression,我在中遇到了以下函数: 有没有一种方法可以从字符串构造调用对象?通常应该避免解析用户输入的任意字符串。通常,这可以通过适当的软件设计来避免 无论如何,只需从表达式中提取语言: make_function(alist(a = 1, b = 2), parse(text = 'a^b')[[1]]) 编辑: 只是为了展示如何对照白名单(不涉及正则表达式)进行检查: 白名单谢谢@Roland。但是,我同意,我有一个闪亮的应用程序,允许用户通过在GUI中的文本输入中输入表达式(例如'x^n')来创建自

我在中遇到了以下函数:


有没有一种方法可以从字符串构造
调用
对象?

通常应该避免解析用户输入的任意字符串。通常,这可以通过适当的软件设计来避免

无论如何,只需从表达式中提取语言:

make_function(alist(a = 1, b = 2), parse(text = 'a^b')[[1]])
编辑:

只是为了展示如何对照白名单(不涉及正则表达式)进行检查:


白名单谢谢@Roland。但是,我同意,我有一个闪亮的应用程序,允许用户通过在GUI中的
文本输入中输入表达式(例如
'x^n'
)来创建自己的函数。因此,我想我可以在应用服务器中使用类似于
make_function
的东西,将用户输入的字符串转换成
function
对象。在这种情况下,是否有比
make_功能
更安全的替代方案?另外,当你说要避免解析任意字符串输入时,你是在暗示
quote(a+b)
parse(text='a^b')
更受欢迎吗?我非常感谢你的输入,因为我一直很小心使用
parse()
。正如Lumley教授所说,“如果答案是parse(),你通常应该重新思考这个问题”,但除了不允许用户创建自己的函数外,我想不出任何替代方案。特别是对于一个闪亮的应用程序,我希望在评估之前至少对用户输入进行清理和检查。一种方法是从解析的表达式中提取所有函数,并与白名单中的函数进行比较。感谢您的回复。是的,我曾计划修改
make_函数
,以包含一些类似的检查,例如使用正则表达式检查任何不允许的字符或运算符,这样就足够了吗?不过,我没有想过要创建一个白名单,谢谢你的建议。再想想,regex可能不是最好的选择。由于用户可以指定任何数学表达式,因此最好使用“make_function”创建函数,然后使用
tryCatch
测试表达式是否有效?
add <- make_function(alist(a = 1, b = 2), quote(a + b))
add
function (a = 1, b = 2) 
a + b

class(add)
[1] "function"
class(quote(a + b))
[1] "call"
class(parse(text = 'x^m'))
[1] "expression"
make_function(alist(a = 1, b = 2), parse(text = 'a^b')[[1]])
whitelist <- c("+", "*", "-", "/", "^", "**", "%%", "%/%", "sin", "cos", "tan", "abs") #etc.
expr <- parse(text = "cos(x)^sin(x)*abs(x)")
foo <- function(e) if (length(e) > 1) lapply(as.list(e), foo) else return(e)
funs <- unlist(foo(expr[[1]]))
funs <- funs[vapply(funs, function(x) {x <- eval(x); is.function(x) | is.primitive(x)}, FUN.VALUE = TRUE)]
all(vapply(funs, function(x) as.character(x) %in% whitelist, FUN.VALUE = TRUE))