在 if_else 和 df$ 中使用 rlang 以字符串形式提供变量名称
Provide a variable name as a string using rlang in if_else and df$
在下面的代码中,
library(tidyverse)
mtcars %>% mutate(var2 = if_else(mpg >20, 1, 0))
as.numeric(as.vector(mtcars$mpg))
我想将 mpg 参数化为
var1 <- "mpg"
但是,下面的代码没有抛出正确的结果,我确定我没有正确使用 rlang。
mtcars %>% mutate(var2 = if_else(!!quo(var1) >20, 1, 0))
as.numeric(as.vector(mtcars$!!quo(var1)))
我在这里错过了什么?
我们可以将字符串转换为符号,然后计算 (!!
)
library(tidyverse)
mtcars %>%
mutate(var2 = if_else(!! rlang::sym(var1) >20, 1, 0))
此处不需要 ifelse
,因为 as.integer
可以将 TRUE/FALSE 强制为 1/0
mtcars %>%
mutate(var2 = as.integer(!! rlang::sym(var1) >20))
对于第二段代码,我们可以使用[[
代替$
来提取列
as.numeric(mtcars[[var1]])
如果对带有 quosures 的表达式有疑问,请使用 qq_show
来理解潜在的问题
rlang::qq_show(mtcars %>%
mutate(var2 = if_else(!!quo(var1) >20, 1, 0)))
#mtcars %>% mutate(var2 = if_else((^var1) > 20, 1, 0))
现在可以进行符号转换
rlang::qq_show( mtcars %>%
mutate(var2 = if_else(!! rlang::sym(var1) >20, 1, 0)))
#mtcars %>% mutate(var2 = if_else(mpg > 20, 1, 0))
请注意,在第一种情况下,它被计算为 'var1' 而不是列 'mpg'
在下面的代码中,
library(tidyverse)
mtcars %>% mutate(var2 = if_else(mpg >20, 1, 0))
as.numeric(as.vector(mtcars$mpg))
我想将 mpg 参数化为
var1 <- "mpg"
但是,下面的代码没有抛出正确的结果,我确定我没有正确使用 rlang。
mtcars %>% mutate(var2 = if_else(!!quo(var1) >20, 1, 0))
as.numeric(as.vector(mtcars$!!quo(var1)))
我在这里错过了什么?
我们可以将字符串转换为符号,然后计算 (!!
)
library(tidyverse)
mtcars %>%
mutate(var2 = if_else(!! rlang::sym(var1) >20, 1, 0))
此处不需要 ifelse
,因为 as.integer
可以将 TRUE/FALSE 强制为 1/0
mtcars %>%
mutate(var2 = as.integer(!! rlang::sym(var1) >20))
对于第二段代码,我们可以使用[[
代替$
来提取列
as.numeric(mtcars[[var1]])
如果对带有 quosures 的表达式有疑问,请使用 qq_show
来理解潜在的问题
rlang::qq_show(mtcars %>%
mutate(var2 = if_else(!!quo(var1) >20, 1, 0)))
#mtcars %>% mutate(var2 = if_else((^var1) > 20, 1, 0))
现在可以进行符号转换
rlang::qq_show( mtcars %>%
mutate(var2 = if_else(!! rlang::sym(var1) >20, 1, 0)))
#mtcars %>% mutate(var2 = if_else(mpg > 20, 1, 0))
请注意,在第一种情况下,它被计算为 'var1' 而不是列 'mpg'