【问题标题】:Why is plotly() and enquo + !! in conflict?为什么是 plotly() 和 enquo + !!冲突?
【发布时间】:2020-03-04 08:53:16
【问题描述】:

我正在编写一个将 plot_ly 用于饼图的函数。参数标签中的波浪号 (~) = ~ 与取消引用运算符 !! 冲突。这个问题有解决办法吗?

pieplotr <- function (df, Property){

Property_Name <- enquo(Property)

Pie <- plot_ly(df,
              labels = ~!!Property_Name,
              type = "pie")

return(Pie)

}
Toy_dataframe <- data.frame(
                 Sex = c("Male", "Female", "Female", "Male", "Male","NA"),
                 Height = c(12,11,7,3,9,NA),
                 Name = c("John", "Dora", "Dora","Dora", "Anna", "John"),
                 Last = c("Henry", "Paul", "House", "Houze", "Henry", "Bill"),
                 Location = c("Chicago", "Chicago", "Portland", "NYC", "NYC", "NYC"),
                 stringsAsFactors = TRUE)

例如

pieplotr(df = Toy_dataframe,
          Property = Name)

我希望返回一个饼图,但我收到以下错误消息:

as.list.environment(x, all.names = TRUE) 中的错误:
找不到对象“名称”

【问题讨论】:

  • enquo !! 在 tidyverse 包/环境中工作。 plotly 不是 tidyverse 包
  • 感谢您的观察!请参阅添加的 Toy_dataframe 进行测试。

标签: r r-plotly rlang quotations quasiquotes


【解决方案1】:

创建表达式后我们可以evaluate

pieplotr <- function (df, Property){

Property_Name <- rlang::enquo(Property)
rlang::eval_tidy(
    rlang::quo_squash(quo(
    plot_ly(df, labels = ~!!Property_Name,  type = "pie")
    )))


} 




pieplotr(df = Toy_dataframe, Property = Name)

-输出


或者去掉~!!

pieplotr <- function (df, Property){

Property_Name <- rlang::enquo(Property)

    plot_ly(df, labels = Property_Name,  type = "pie")



}

pieplotr(df = Toy_dataframe, Property = Name)

【讨论】:

  • 成功了!太感谢了。你介意带我走过你的思考过程吗?我将不胜感激,这样我可以更好地了解解决方案。
  • @SophCarr 这不是一个简单的解决方案,因为我们 evaluating 使用 quo 创建的表达式,quo_squash 将表达式展平,并在其之上进行评估。正如我在 cmets 中提到的,plotly 不是 tidyverse 兼容包。
  • @SophCarr 注意到问题也与~!! 部分有关。删除它有效
  • 真的不需要quo / quo_quash。您可以只使用rlang::expr( plot_ly(df, labels = ~!!Property_name, type="pie") ),它将创建适当的表达式。 (@SophCarr:尝试从函数返回rlang::expr 的输出,看看它做了什么)。然后使用eval_tidy 评估表达式。
  • @ArtemSokolov 甚至不需要
【解决方案2】:

另一种解决方案是完全避免非标准评估/拟定,只需修改调用函数的方式

pieplotr <- function (df, Property) {
    plot_ly(df, labels = Property, type = "pie")
}

pieplotr( Toy_dataframe, ~Name )    # Notice the ~

之所以在这里起作用,是因为plotly Universe 使用公式(通过~ 定义)来传递有关变量的信息。 Tidyverse 使用未计算的表达式而不是公式,这就是需要enquo() 等的原因。

【讨论】:

    【解决方案3】:

    我试图找到一种在函数内使用plot_ly 的方法,但也试图避免传递未加引号的变量名。事实证明,在 plot_ly 调用中传递引用的列名、解析和评估效果很好,而且,至少对我来说,它比其他一些解决方案更容易阅读和理解:

    ply <- function(data, x, y) {
    
      name_x <- parse(text = x)
      name_y <- parse(text = y)
    
      plotly::plot_ly(data = data, x = ~eval(name_x), y = ~eval(name_y)) %>%
        plotly::add_trace(type = "scatter")
    }
    
    ply(faithful, "eruptions", "waiting")
    

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 2018-09-16
      • 2021-11-08
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多