首页 > 解决方案 > R中的嵌套/递归字符串插值?字符串::str_interp

问题描述

我正在编写一个基于模板和命名列列表创建 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, '\\', number, ' - ', dots[[1]])
}

标签: rtidyversestringrrmysql

解决方案


推荐阅读