如何在 Sparklyr 中使用 R 函数

How to use R function in Sparklyr

我正在研究如何在线使用 R 函数,但仍然很难搞清楚。请帮忙。

我的初始代码如下:

whatever %>%
group_by(a) %>%
summarize(count=n()) %>%
collect() %>%
ggplot(aes(x=a, y=count)) +
geom_point()

我想重复多次,因为我想用相同的功能检查其他列。

所以我写道:

point_dist <- function(dta, vari) {
dta %>%
group_by(vari) %>%
summarize(count=n()) %>%
collect() %>%
ggplot(aes(x=vari, y=count)) +
gemo_point()
}

point_dist(whatever, a)

但继续告诉我:

Error in eval_bare(sym, env) : object 'a' not found

不知道为什么。

我也不知道这是否是我应该走的正确方向。

再次感谢。

如果您要汇总数据并传输到 ggplot,则无需使用 collect()

df <- data.frame(group=sample(letters[1:10],1000,T))

df %>% group_by(group) %>% summarise(n=n()) %>% 
  ggplot(aes(group,n)) + geom_point()

如果您要将此摘要和绘图方法应用于多列,我建议尝试 gather() 然后使用 + facet_wrap() 和条形图一次绘制所有内容。

df <- data.frame(matrix(sample(letters[1:10],10000,T),ncol = 10))

df %>% gather(k,v) %>% group_by(k,v) %>% summarise(n=n()) %>% 
  ggplot(aes(k,n,fill=v)) + geom_bar(stat='identity') + 
  facet_wrap(~v) + theme(legend.position = 'none')

您的问题与 dplyr 函数倾向于给您的 non-standard 评估有关。当您在第一次调用 point_dist 时引用 a 时,R 会尝试对其求值,当然会失败。 (当你在你的调用环境或更高的环境中有一些这样命名的变量时,它会更加混乱......)

dplyr 中的

NSE 意味着您可以执行类似 select(mtcars, cyl) 的操作,而对于大多数 standard-evaluation 函数,您将需要 myfunc(mtcars, "cyl"),因为没有调用环境中名为 cyl 的变量。

对于你的情况,尝试:

point_dist <- function(dta, vari) {
  vari <- enquo(vari)
  dta %>%
    group_by(!!vari) %>%
    summarize(count=n()) %>%
    collect() %>%
    ggplot(aes(x=!!vari, y=count)) +
    gemo_point()
}

如果您熟悉普通的 R 函数定义 and/or 不熟悉 NSE,那么这种处理函数中未引用 column-names 的方法可能会造成混淆。如果您打算使用它,这对您来说可能是一个很好的模板,否则我强烈 敦促您在下面的第一个参考资料中多读一点。

NSE 的一些很好的参考,特别是 in/around tidyverse 的东西: