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