3

我正在编写一个将 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) 中的错误:
找不到对象“名称”

4

3 回答 3

2

我们可以eval在创建创建表达式后评估

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)
于 2019-11-07T18:10:46.357 回答
2

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

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

pieplotr( Toy_dataframe, ~Name )    # Notice the ~

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

于 2019-11-07T18:43:46.977 回答
0

我试图找到一种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")
于 2020-06-03T02:21:37.743 回答