如何计算嵌套函数中的粘合表达式?

2024-06-20

我正在尝试嵌套一个函数,该函数将两个字符串粘合在一起,该函数使用组合字符串来命名数据帧的列。然而,问题似乎是粘合表达式没有足够早地评估为字符串。我可以(并且应该)强制在将表达式作为参数传递给另一个函数之前对其进行求值吗?

library(tidyverse)

# define inner function
add_prefix <- function(string) {
  x <- glue::glue("prefix_{string}")
  return(as.character(x))
}

# define outer function
mod_mtcars <- function(df, name) {
  df %>% 
    mutate({{ name }} := mpg ^ 2)
}

mod_mtcars(mtcars, add_prefix("foo"))
#> Error: The LHS of `:=` must be a string or a symbol

# alternative outer function with explicit enquoting
mod_mtcars2 <- function(df, name) {
  name <- ensym(name)
  
  df %>% 
    mutate(!!name := mpg ^ 2)
}

mod_mtcars2(mtcars, add_prefix("foo"))
#> Error: Only strings can be converted to symbols

Created on 2021-10-30 by the reprex package https://reprex.tidyverse.org (v2.0.1)


首先,现在更喜欢使用粘合字符串语法,而不是直接在 LHS 中使用。所以更喜欢"{{ var }}" := expr to {{ var }} := expr。在 rlang 的未来版本(明年)中,我们将可以使用粘合字符串=。在那时候,:=几乎将被取代。我们一起去:=允许!!在添加胶水支撑之前在 LHS 上进行注射。

其次,你的问题是你正在使用{{而不是简单的注射。{{用于注入表达作为参数提供,而不是value的表达式。使用普通的胶水插值"{"改为注入值:

mod_mtcars <- function(df, name) {
  df %>% 
    mutate("{name}" := mpg ^ 2)
}

PS:你的!!版本也有类似的问题。因为你用过ensym()在参数上,您正在解构作为参数提供的表达式,而不是使用该值。但ensym()要求表达式是一个简单的名称,而您提供了完整的计算,从而导致错误。你可以这样修复它:

mod_mtcars2 <- function(df, name) {
  df %>%
    mutate(!!name := mpg ^ 2)
}

但现在首选粘合语法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何计算嵌套函数中的粘合表达式? 的相关文章

随机推荐