prop.test和dplyr的客户功能错误

prop.test和dplyr的客户功能错误,r,dplyr,R,Dplyr,以下代码运行良好: library(dplyr) library(lazyeval) datatable <- data.frame(f= c("Group1","Group2") ,a = c(100,200) ,b = c(400,500) ,c = c(50000,35000) ,d = c(99000,70000)) datatable %>% group_by(f) %&g

以下代码运行良好:

library(dplyr)
library(lazyeval)
datatable <- data.frame(f= c("Group1","Group2")
           ,a = c(100,200)
           ,b = c(400,500)
           ,c = c(50000,35000)
           ,d = c(99000,70000))

datatable %>%
      group_by(f) %>%
      mutate(p = prop.test(x=c(a, b)
                           ,n=c(c, d)
                           ,alternative = c("two.sided")
                           ,correct = FALSE)$p.value)
库(dplyr)
图书馆(懒汉)
数据表%
按(f)分组%>%
变异(p=prop.test)(x=c(a,b)
,n=c(c,d)
,备选方案=c(“双面”)
,correct=FALSE)$p.value)
但是,当放入函数中时,代码错误:

functionx <- function(datatable, f, a, b, c, d)
  {
    Table <- datatable %>%
              group_by_(f) %>%
              mutate_(p = interp(~prop.test(x=c(a, b)
                                            ,n=c(c, d)
                                            ,alternative = c("two.sided")
                                            ,correct = FALSE)$p.value))
  }
functionx%
突变(p=interp(~prop.test)(x=c(a,b)
,n=c(c,d)
,备选方案=c(“双面”)
,correct=FALSE)$p.value)
}
我收到的错误如下所示:

错误:二进制运算符的非数值参数


我尝试过用几种不同的方法编写函数(例如a=as.name(a))。我不熟悉编写函数(特别是NSE/SE)——非常感谢您的帮助。

我能够找到问题的解决方案。建议阅读dplyr vignettes文档:

functionx%
分组依据(facet.var)%>%
突变(p=interp(~prop.test)(x=c(a,b)
,n=c(d,e)
,备选方案=c(“双面”)
,correct=FALSE)$p.value
,a=as.name(treated.take)
,b=as.name(holdout.take)
,d=as.name(treated.pop)
,e=as.name(holdout.pop))
)
}

datatablex为您做什么?来自图书馆(lazyeval)。dplyr使用非标准评估(NSE),我认为函数需要标准评估(SE)。interp将NSE转换为SE,我相信-看到了吗?嗯,我以前从未遇到过这种情况,你能发布一个示例数据帧吗?请提供示例输入,以便我们可以看到你传递给函数的内容并重新创建错误。另外,显式列出您导入的所有包。您编写了“dplyr使用NSE”,但在您的函数定义中,您实际上使用的是group_by和mutate的SE版本。例如,如果
f
datatable
中一列的名称,那么
groupby(“f”)
应该用于分组。
functionx <- function(datatable, facet.var, treated.take, holdout.take, treated.pop, holdout.pop)
{
  datatable %>%
    group_by_(facet.var) %>%
    mutate_(p = interp(~prop.test(x=c(a, b)
                                  ,n=c(d, e)
                                  ,alternative = c("two.sided")
                                  ,correct = FALSE)$p.value
                            ,a = as.name(treated.take)
                            ,b = as.name(holdout.take)
                            ,d = as.name(treated.pop)
                            ,e = as.name(holdout.pop))

    )
}

datatablex <- data.frame(facet.varx= c("Group1","Group2")
           ,treated.takex = c(100,200)
           ,holdout.takex = c(400,500)
           ,treated.popx = c(50000,35000)
           ,holdout.popx = c(99000,70000))

functionx(datatablex, "facet.varx", "treated.takex", "holdout.takex", "treated.popx", "holdout.popx")