【问题标题】:Rlang: how to treat strings as symbolsRlang:如何将字符串视为符号
【发布时间】:2020-02-23 05:54:34
【问题描述】:

我再次对rlang 的文档和错误消息感到困惑。我已经使用双刘海和三刘海尝试了 20 次不同的迭代,:=quoenquoensym,以及所有其他名称不明的 rlang 函数。

如果您感到沮丧,那是因为每次我尝试使用 rlang 处理对象名称的变量时,我都会遇到相同的问题。我错过了一些关键的东西吗?我傻吗? rlang 函数名称和文档真的很差吗?

我正在尝试确定tibble 中的变量类。除了帮助执行此操作外,如果有人能建议我如何在文档中找到此问题的答案,我将不胜感激。

require(tidyverse)
require(rlang)

x <- enframe(names(mtcars), name = NULL, value = "var") %>% 
  add_column(df = "mtcars")

x %>% mutate(cls = class(sym(paste0(df, "$", var))))
#> Only strings can be converted to symbols

reprex package (v0.3.0) 于 2019 年 10 月 27 日创建

【问题讨论】:

  • x %&gt;% mutate(cls = class(eval(parse(text = paste0(df, "$", var)))))?
  • @Matt 无法按预期工作。 mtcars2 % mutate(cyl = as.character(cyl)) x % add_column(df = "mtcars2") x %>% mutate(cls = class(eval(parse(text = paste0(df, "$", var)))))
  • 是的,我忘记了rowwise,如果你在x %&gt;% rowwise %&gt;% mutate(cls = class(eval(parse(text = paste0(df, "$", var))))) 中添加它应该可以工作

标签: r tidyverse rlang


【解决方案1】:

1) 解析和评估它。

library(dplyr)
library(rlang)

x %>% rowwise %>% mutate(cls = class(eval_tidy(parse_expr(paste0(df, "$", var)))))

2) 或使用来自 rlang 的 sym 和来自 purrr 的 pull

library(dplyr)
library(purrr)
library(rlang)

x %>% rowwise %>% mutate(cls = class(pull(eval_tidy(sym(df)), var)))

3) 或基 R 函数get 检索df

library(dplyr)

x %>% rowwise %>% mutate(cls = class(get(df)[[var]]))

【讨论】:

  • 请注意,如果您想在 (3) 中坚持使用 tidyverse,您可以使用 env_get(environment(), df, inherit = TRUE) 代替 get(df)
猜你喜欢
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2019-02-27
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多