2
4

3 回答 3

2

您可以blast()用于 quasiquotation 并立即评估

blast <- function(expr, env = caller_env()) {
  eval_bare(enexpr(expr), env)
}

blast(list(!!!1:3))
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 2
#>
#> [[3]]
#> [1] 3

然后

myfun <- "apply.quarterly"

blast(
  FANG %>%
    group_by(symbol) %>%
    tq_transmute(
      select = adjusted,
      mutate_fun = !!sym(myfun),
      FUN = max,
      col_rename = "max.close"
    )
)
于 2020-10-21T07:19:23.393 回答
1

由于某种原因,该功能似乎有点挑剔。一种方法是更改​​呼叫,然后对其进行评估。例如

myfun <- "apply.quarterly"
bquote(FANG %>%
  group_by(symbol) %>%
  tq_transmute(select     = adjusted, 
               mutate_fun = .(as.name(myfun)),
               FUN        = max, 
               col_rename = "max.close")) %>% 
  eval()

或者如果您更喜欢 rlang 语法

myfun <- "apply.quarterly"
quo(FANG %>%
         group_by(symbol) %>%
         tq_transmute(select     = adjusted, 
                      mutate_fun = !!sym(myfun),
                      FUN        = max, 
                      col_rename = "max.close")) %>% 
  eval_tidy()

请注意,我们必须将整个表达式视为rlangquosure。除非该tq_transmute函数是专门为处理 rlang 特性而编写的,否则!!默认情况下它们将不起作用。

于 2020-10-20T21:07:27.820 回答
0

您可以使用get从带有函数名称的字符串中获取函数。例如,以下工作:

s <- get("sum")
s(c(1,2,3))
于 2020-10-20T20:04:41.427 回答