使用dplyr和enquo,我的代码可以工作,但当我传递到purr::map时就不行了

使用dplyr和enquo,我的代码可以工作,但当我传递到purr::map时就不行了,r,ggplot2,dplyr,purrr,quosure,R,Ggplot2,Dplyr,Purrr,Quosure,我想为名为dates的向量中的每一列创建一个绘图。我的数据框只包含这些列,我想对其进行分组,计算出现次数,然后进行打印 下面的代码可以工作,除了map,我想用它来遍历以前未知数量的列。我想我正确地使用了map,我以前用过它。我不熟悉使用quosures,但考虑到我的函数调用是有效的,我不确定到底出了什么问题。我已经看过了其他几个似乎是这样设置的帖子 df <- data.frame( date1 = c("2018-01-01","2018-01-01","2018-01-01","2

我想为名为dates的向量中的每一列创建一个绘图。我的数据框只包含这些列,我想对其进行分组,计算出现次数,然后进行打印

下面的代码可以工作,除了
map
,我想用它来遍历以前未知数量的列。我想我正确地使用了
map
,我以前用过它。我不熟悉使用quosures,但考虑到我的函数调用是有效的,我不确定到底出了什么问题。我已经看过了其他几个似乎是这样设置的帖子

df <- data.frame(
  date1 = c("2018-01-01","2018-01-01","2018-01-01","2018-01-02","2018-01-02","2018-01-02"),
  date2 = c("2018-01-01","2018-01-01","2018-01-01","2018-01-02","2018-01-02","2018-01-02"),
  stringsAsFactors = FALSE
)
dates<-names(df)

library(tidyverse)

dates.count<-function(.x){
  group_by<-enquo(.x)
  df %>% group_by(!!group_by) %>% summarise(count=n()) %>% ungroup() %>% ggplot() + geom_point(aes(y=count,x=!!group_by))
}
dates.count(date1)
map(dates,~dates.count(.x))
df%ggplot()+几何点(aes(y=计数,x=!!分组依据))
}
日期。计数(日期1)
映射(日期,~dates.count(.x))

我得到了这个错误:分组的_df_impl(data,unname(vars),drop)中的错误:
.x
列未知

当您将变量名传递给
map()
时,您使用的是字符串,这表明您需要
ensym()
而不是
enquo()

所以你的函数看起来像

dates.count <- function(.x){
    group_by = ensym(.x)
    df %>% 
        group_by(!!group_by) %>% 
        summarise(count=n()) %>% 
        ungroup() %>% 
        ggplot() + 
        geom_point(aes(y=count,x=!!group_by))
}
请注意,tidyeval并不总是能很好地使用
map()
(我想我记对了)。您总是可以改为使用匿名函数,但如果您希望将列名映射到具有单个参数的函数,则只需执行以下操作即可

map(dates, dates.count)
使用
map()
中的公式接口,我需要一个额外的

map(dates, ~dates.count(!!.x))

map(dates,dates.count)
对您有用吗?这会生成两个绘图,但它们不正确。x轴看起来是字符(或离散的),只有列名作为单轴分隔符,而不是轴上的日期。在什么时候转换为
Date
对象?您可能希望在数据生成/管理中包含
%>%mutate_at(vars(date1,date2),funs(as.Date())
。在我的真实代码和数据中,列是日期对象(日期是一个向量,仅由数据框中日期对象的名称组成)。这很有效。我理解你所说的变量名是字符串的意思——我试着根据不同的答案使用
sym
。我不明白的是为什么使用“~dates.count(.x)”不起作用。关于是否需要取消引用它需要不同的语法?
map(dates, ~dates.count(!!.x))