问题描述
我正在编写一个函数,该函数基于模板和命名的列列表创建 MysqL 查询。但是,命名列表中的一列包含一个函数,该函数返回应该进入查询行的 sql 代码。如果我在整个过程中调用 str_interp
,则除了函数行之外的所有内容都被转换,它仍然是一个函数。
下面是一个非常简化的可重现示例。我知道该函数可以创建查询,如果我然后调用,则整个过程都可以正常工作:
query <- stringr::str_interp(query)
或
query <- stringr::str_interp(stringr::str_interp(DEFAULT_QUERY))
但在其他情况下感觉多余且有潜在危险?我想知道是否有更好的方法来递归 str_interp
或者只是强制它在之后进行评估。有什么想法吗?
此外,不确定是否有更好的方法来引用 score_format_function
中的内容,因为我是准引用的新手。谢谢!
DEFAULT_QUERY <- "SELECT ${paste(grplines,collapse=',\n ')} FROM table1 t1 join table2 t2 on t1.uid = t2.uid;"
features <- list(
`Age`='t1.age',`Gender`='t2.gender',`Race`='t2.race',`Processed score`='${score_format_function(score,10,100)}'
)
grplines <- paste0(features,' as `',names(features),'`')
query <- string::str_interp(DEFAULT_QUERY)
score_format_function <- function(column,number,...) {
rlang::as_stringr(rlang::enexpr(column))
rlang::enexpr(number)
dots <- rlang::list2(...)
paste0(column,'\\',' - ',dots[[1]])
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)