【问题标题】:How to use R function in Sparklyr如何在 Sparklyr 中使用 R 函数
【发布时间】:2019-07-16 21:42:07
【问题描述】:

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

不知道为什么。

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

再次感谢。

【问题讨论】:

    标签: r dplyr sparklyr


    【解决方案1】:

    您的问题与dplyr 函数倾向于给您的非标准评估有关。当您在第一次调用 point_dist 时引用 a 时,R 会尝试评估它,这当然会失败。 (当您在调用环境或更高版本中有一些这样命名的变量时,这会更加令人困惑......)

    dplyr 中的 NSE 意味着您可以执行类似 select(mtcars, cyl) 的操作,而对于大多数标准评估函数,您将需要 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 函数定义和/或不熟悉 NSE,那么这种处理函数中不带引号的列名的方法可能会令人困惑。如果您打算使用它,这对您来说可能是一个很好的模板,否则我强烈建议您在下面的第一个参考资料中阅读更多内容。

    一些很好的 NSE 参考资料,特别是在 tidyverse 中/周围:

    【讨论】:

    • 非常感谢您耐心的解释。我还阅读了第一个参考资料,非常有帮助。您的代码中只有拼写错误,ggplot(aes(!!vari...))。非常感谢!
    • 感谢您指出错字。你能接受答案吗?
    • 当然可以。再次感谢。
    【解决方案2】:

    如果您正在汇总数据并通过管道传输到 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')
    

    【讨论】:

    • 基于Yi Du's other questionssparklyr 标记,collect() 的使用可能是因为存在与非本地数据的连接,例如通过sparklyr。我不是它的专家(如果我错了,请纠正我),但我认为在这种情况下建议这样做,以便将管道“实现”为本地数据(因为我认为ggplot(...) 不知道如何处理承诺的数据)。
    • 我刚刚尝试不使用 collect() 并且它有效。谢谢。如果没有 collect(),这实际上会加快计算时间吗?
    猜你喜欢
    • 2017-02-17
    • 2021-01-08
    • 2017-09-23
    • 2021-12-01
    • 2019-11-15
    • 2018-11-14
    • 2019-06-16
    • 2019-04-11
    • 2018-06-24
    相关资源
    最近更新 更多