Почему плотно () и enquo + !! в конфликте? - PullRequest
3 голосов
/ 07 ноября 2019

Я пишу функцию, которая использует plot_ly для круговой диаграммы. Тильда (~) в метках аргумента = ~ конфликтует с оператором unquote !!. Есть ли решение этой проблемы?

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):
объект 'Имя' не найден

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Мы можем 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)

-output

enter image description here


Илиудалить ~!!

pieplotr <- function (df, Property){

Property_Name <- rlang::enquo(Property)

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



}

pieplotr(df = Toy_dataframe, Property = Name)
1 голос
/ 07 ноября 2019

Альтернативное решение состоит в том, чтобы полностью избежать нестандартной оценки / квазиквакации и просто изменить способ вызова функции

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

pieplotr( Toy_dataframe, ~Name )    # Notice the ~

Причина, по которой это работает, заключается в том, что в юниверсе plotly используются формулы (определяется через ~) для передачи информации о переменных. Tidyverse использует выражения без оценки вместо формул, что является причиной необходимости enquo() и т. Д.

...