在我的应用程序中,用户可以提供“子集”表达式(由 mix: 变量、存储在变量中的名称 - videargs_input
和subset_args_input
变量组成)作为subset
/[
函数的参数:
df_data <- data.frame("a" = c(1,1,2),
"b" = c(3,4,4),
"c" = c(5,6,7))
global_data <- list("column_to_extract" = c("b"))
args_input <- "list(df_data, df_data$a %in% c(1), global_data[['column_to_extract']])"
我的期望是得到与执行相同的结果:
do.call("[", list(df_data, df_data$a %in% c(1), global_data[['column_to_extract']]))
通过执行这个:
do.call("[", eval(parse(text=args_input)))
另外,我尝试过类似的东西subset
:
subset_args_input <- "list(quote(df_data), quote(a %in% c(1)), quote(global_data[['column_to_extract']]))"
do.call("subset", eval(parse(text=subset_args_input)))
- 这两种方法都有效,但需要
eval
+parse
,如果允许用户传递任何字符串,这是不安全的。eval
问题 - 如果没有+parse
组合,是否可以达到相同的结果? - 您(R 用户:)能否请看一下上面的片段 - 是否有任何不必要的东西/违反 R 哲学的东西?