如何在 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 的东西:
我正在研究如何在线使用 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 的东西: