R 如何通过;“一切可能”;在函数中通过?

R 如何通过;“一切可能”;在函数中通过?,r,data.table,non-standard-evaluation,R,Data.table,Non Standard Evaluation,我试图在我正在处理的包中面向用户的函数中使用data.table。我希望此函数尽可能像data.table-一样工作。例如,这意味着我的函数还具有一个by参数,该参数被传递到函数内的底层data.table调用。用户可以自由地通过将任何内容传递到“我的”,这可以直接在数据表中实现 引用?数据表,包括: 单个不带引号的列名:例如,DT[,(sa=sum(A)),by=x] 列名表达式的列表():例如,DT[,(sa=sum(a)),by=(x=x>0,y)] 包含逗号分隔的列名的单个字符串(其中空

我试图在我正在处理的包中面向用户的函数中使用
data.table
。我希望此函数尽可能像
data.table
-一样工作。例如,这意味着我的函数还具有一个
by
参数,该参数被传递到函数内的底层
data.table
调用。用户可以自由地通过将任何内容传递到“我的”
,这可以直接在
数据表中实现

引用
?数据表
,包括:

  • 单个不带引号的列名:例如,DT[,(sa=sum(A)),by=x]
  • 列名表达式的列表():例如,DT[,(sa=sum(a)),by=(x=x>0,y)]
  • 包含逗号分隔的列名的单个字符串(其中空格很重要,因为列名可能在开始或结束处都包含空格):例如,DT[,sum(a),by=“x,y,z”]
  • 列名的字符向量:例如,DT[,sum(a),by=c(“x”,“y”)]
  • 或形式为startcol:endcol:例如,DT[,和(a),by=x:z]
  • 下面是一个简单(部分)的工作示例,以明确我的意图:

    库(data.table)
    #>警告:包“data.table”是在R版本3.6.2下生成的
    N的样本值
    #> 1:  1 1
    #> 2:  2 1
    #> 3:  3 1
    #> 4:  4 1
    #> 5:  5 1
    count_by(sample_dt,by=list(a))#指上述列表中的2
    #>a N
    #> 1: 1 1
    #> 2: 2 1
    #> 3: 3 1
    #> 4: 4 1
    #> 5: 5 1
    count_by(sample_dt,by=“a”)#指上述列表中的3
    #>a N
    #> 1: 1 1
    #> 2: 2 1
    #> 3: 3 1
    #> 4: 4 1
    #> 5: 5 1
    count_by(sample_dt,by=c(“a”)#指上述列表中的4
    #>“[.data.table`(dt.N,by=eval(by,dt,parent.frame()))”中的错误:“'by'似乎对列名求值,但不是c()或key()。如果可以,请使用by=list(…)。否则,by=evalc(“a”)应该可以工作。这是为了提高效率,以便data.table可以检测需要哪些列。
    count_by(sample_dt,by=a:b)#指上述列表中的5
    #>a b N
    #> 1: 1 5 1
    #> 2: 2 4 1
    #> 3: 3 3 1
    #> 4: 4 2 1
    #> 5: 5 1 1
    
    由(v0.3.0)于2020年2月18日创建

    除了案例4外,在适当的环境下,通过简单的替换和评估,一切都能按预期进行。因此,我的问题是:

    如何创建内部使用
    data.table
    并通过
    用户界面准确模仿原始
    的函数?


    会话信息

    devtools::session_info()
    #>-会话信息---------------------------------------------------------------
    #>设定值
    #>R版3.6.1版(2019-07-05)
    #>操作系统Windows 10 x64
    #>系统x86_64,mingw32
    #>用户界面RTerm
    #>语言(英文)
    #>核对德语和德语。1252
    #>ctype German_Germany.1252
    #>欧洲/柏林
    #>日期2020-02-18
    #> 
    #>-包裹-------------------------------------------------------------------
    #>包*版本日期库源
    #>资产负债表0.2.1 2019-03-21[1]起重机(R 3.6.2)
    #>后端口1.1.5 2019-10-02[1]起重机(R 3.6.1)
    #>callr 3.4.1 2020-01-24[1]起重机(R 3.6.2)
    #>cli 2.0.1 2020-01-08[1]起重机(R 3.6.2)
    #>蜡笔1.3.4 2017-09-16[1]克兰(R 3.6.2)
    #>数据表*1.12.8 2019-12-09[1]起重机(R 3.6.2)
    #>描述1.2.0 2018-05-01[1]起重机(R 3.6.2)
    #>开发工具2.2.1 2019-09-24[1]起重机(R 3.6.2)
    #>摘要0.6.23 2019-11-23[1]克兰(R 3.6.2)
    #>省略号0.3.0 2019-09-20[1]CRAN(R 3.6.2)
    #>评估0.14 2019-05-28[1]起重机(R 3.6.2)
    #>fansi 0.4.1 2020-01-08[1]起重机(R 3.6.2)
    #>fs 1.3.1 2019-05-06[1]起重机(R 3.6.2)
    #>胶水1.3.1 2019-03-12[1]起重机(R 3.6.2)
    #>高0.8 2019-03-20[1]克兰(R 3.6.2)
    #>htmltools 0.4.0 2019-10-04[1]起重机(R 3.6.2)
    #>克尼特1.27 2020-01-16[1]克兰(R 3.6.2)
    #>magrittr 1.5 2014-11-22[1]克兰(R 3.6.2)
    #>备忘录1.1.0 2017-04-21[1]克兰(R 3.6.2)
    #>pkgbuild 1.0.6 2019-10-09[1]起重机(R 3.6.2)
    #>pkgload 1.0.2 2018-10-29[1]克兰(R 3.6.2)
    #>prettyunits 1.1.1 2020-01-24[1]起重机(R 3.6.2)
    #>processx 3.4.1 2019-07-18[1]起重机(R 3.6.2)
    #>ps 1.3.0 2018-12-21[1]起重机(R 3.6.2)
    #>R6 2.4.1 2019-11-12[1]起重机(R3.6.2)
    #>Rcpp 1.0.3 2019-11-08[1]起重机(R 3.6.2)
    #>遥控器2.1.0 2019-06-24[1]起重机(R 3.6.2)
    #>rlang 0.4.4 2020-01-28[1]起重机(R 3.6.2)
    #>R标记2.1 2020-01-20[1]起重机(R 3.6.2)
    #>rprojroot 1.3-2 2018-01-03[1]起重机(R 3.6.2)
    #>会议信息1.1.1 2018-11-05[1]CRAN(R 3.6.2)
    #>stringi 1.4.4 2020-01-09[1]起重机(R 3.6.2)
    #>纵梁1.4.0 2019-02-10[1]起重机(R 3.6.2)
    #>测试2.3.1 2019-12-01[1]起重机(R 3.6.2)
    #>使用本1.5.1 2019-07-04[1]起重机(R 3.6.2)
    #>带R 2.1.2 2018-03-15[1]起重机(R 3.6.2)
    #>xfun 0.12 2020-01-13[1]起重机(R 3.6.2)
    #>yaml 2.2.1 2020-02-01[1]起重机(R 3.6.2)
    #> 
    #>[1]C:/Program Files/R/库
    

    在data.table中使用
    eval
    有什么特别的原因吗?我认为这样更好:

    count_by <- function(dt, by = NULL) {
      eval(substitute(dt[, .N, by = by]))
    }
    

    count\u按“特定原因”计算是我的有限知识;)。这与在
    j
    中使用
    get()
    一起工作吗?这不是特定于数据表的。它只是在语言上计算,在不使用
    eval
    的情况下测试函数可能会有帮助。