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
的情况下测试函数可能会有帮助。