Функция purrr и ggplot не отображает график (проблема NSE)

Я подозреваю, что это проблема, связанная с NSE. Но почему эти два подхода не работают и как я могу заставить их работать.

temp1 <- function(x){
  iris %>% 
    ggplot(aes(Sepal.Length, Sepal.Width)) +
    geom_point() +
    facet_wrap(as.formula(paste("~", x)))
}
walk('Species', temp1)


temp2 <- function(x){
  x <- as.name(x)
  iris %>% 
    ggplot(aes(Sepal.Length, Sepal.Width)) +
    geom_point() +
    facet_wrap(~ x)
}
walk('Species', temp2)

person student    schedule 11.10.2017    source источник


Ответы (1)


Мне кажется, это не проблема NSE. Если вы читаете ?walk, там написано (выделение добавлено мной):

walk() вызывает .f для побочного эффекта и возвращает исходный ввод

Пытаться:

t <- walk('Species', temp1)
t
#[1] "Species"

Я думаю, вы можете получить то, что хотите, если добавите явную печать в свой ggplot. Например. изменить temp1 на:

temp1 <- function(x){
  print(iris %>% 
        ggplot(aes(Sepal.Length, Sepal.Width)) +
        geom_point() +
        facet_wrap(as.formula(paste("~", x))))
}
person Mike H.    schedule 11.10.2017
comment
Это имеет смысл. Можете ли вы прокомментировать, почему выполнение этого (альтернативно) через конвейер не работает. Это ... %>% print(). - person student; 11.10.2017
comment
@student, потому что, если вы используете простой конвейер, вы передадите объект facet_wrap() в print. Если вы хотите использовать канал, вы можете сгруппировать все это с помощью (), а затем передать его print. Что-то вроде (iris %>% ...) %>% print() - person Mike H.; 11.10.2017