我已经在我的 Shiny 应用程序中实现了 Patchwork,通过它用户可以轻松地排列多个绘图。由于 Patchwork 的语法很简单,我想向用户显示一个 textInput,通过它他们可以发出“A + B”或“(A | B)/C”等 patchwork 命令。在我的代码中,它看起来像这样:eval(parse(text = input$patchwork_text))
最佳答案
当然,让用户在 Shiny 的 session 中运行代码从来都不是一个好主意,但这就是我要做的,以检查是否只执行您想要允许的对象上的操作。
请注意,这只是一个开始,请扩展此功能。
我不确定是否给出了绘图对象的名称。如果它们是动态创建的,那么您需要获取它们并将名称作为字符串传递到 allowed_nms
参数中。否则,我们可以默认为 LETTERS
,正如@Mikko 在评论中指出的那样。
一般来说,我建议不要使用字符串(和正则表达式),而是使用 str2lang
将字符串转换为调用对象,然后我们可以使用 all.vars()
和其他函数来检查调用。
check_call <- function(inp_string, allowed_nms = LETTERS) {
allowed_fns <- c("+", "-", "/", "(", "|", "&")
inp_call <- str2lang(inp_string)
all_nms <- all.vars(inp_call)
all_sym <- all.names(inp_call)
all_fns <- setdiff(all_sym, all_nms)
if (any(!all_fns %in% allowed_fns)) {
stop("This operation is not allowed")
}
if (!is.null(allowed_nms) && any(!all_nms %in% allowed_nms)) {
stop("Not allowed object name.")
}
}
check_call("(A | B) / C")
check_call("(A | B) / z")
#> Error in check_call("(A | B) / z"): Not allowed object name.
check_call("system('rm -rf /')", allowed_nms = c("A", "B"))
#> Error in check_call("system('rm -rf /')", allowed_nms = c("A", "B")): This operation is not allowed
由 reprex package 于 2022 年 10 月 20 日创建(v2.0.1)
关于r - 限制在评估 (eval()) 用户输入以进行拼凑时可以执行的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74140005/