R 如何在嵌套函数中将所有可能的信息传递给i、j和by?
我正在开发一个使用R 如何在嵌套函数中将所有可能的信息传递给i、j和by?,r,data.table,non-standard-evaluation,R,Data.table,Non Standard Evaluation,我正在开发一个使用data.table的包。在这个包中,我有一个函数count\u by,它按组计算数据表中特定变量的不同ID数。在一些帮助()下,我实现了预期的效果: 库(data.table) #>警告:包“data.table”是在R版本3.6.2下生成的 #创建示例数据 样本3:2020 3 相同(计数依据(样本编号,“id”,x,年份),参考) #>[1]是的 相同(计数依据(样本编号,“id”,“x”,年份),参考) #>[1]是的 相同(计数依据(样本“id”,x,“年份”),参考
data.table
的包。在这个包中,我有一个函数count\u by
,它按组计算数据表中特定变量的不同ID数。在一些帮助()下,我实现了预期的效果:
库(data.table)
#>警告:包“data.table”是在R版本3.6.2下生成的
#创建示例数据
样本3:2020 3
相同(计数依据(样本编号,“id”,x,年份),参考)
#>[1]是的
相同(计数依据(样本编号,“id”,“x”,年份),参考)
#>[1]是的
相同(计数依据(样本“id”,x,“年份”),参考)
#>[1]是的
相同(计数依据(样本编号,“id”,x,c(“年份”)),参考)
#>[1]是的
相同(计数依据(样本“id”、“x”、“年份”),参考)
#>[1]是的
相同(计数依据(样本编号,“id”,“x”,c(“年份”)),参考)
#>[1]是的
相同(计数依据(样本数据,id,“x”,年份),参考)
#>[1]是的
相同(计数依据(样本数据,id,“x”,“年份”),参考)
#>[1]是的
相同(计数依据(样本数据,id,“x”,c(“年份”)),参考)
#>[1]是的
相同(计数依据(样本数据,id,x,“年份”),参考)
#>[1]是的
相同(计数依据(样本dt、id、x、c(“年份”)),参考)
#>[1]是的
由(v0.3.0)于2020年2月20日创建
现在我想在另一个函数中使用函数count\u by()
(下面的最小示例):
#定义包装函数
包装替代品(
+DT[!is.na(get(val_var)),(distinct_id=uniqueN(get(id_var)),by=by]
+ )
数据[!is.na(get(“val_var”),(distinct_id=uniqueN(get(“id_var”)),
通过
由于data
在count\u by()
的函数环境中不可用,因此会将其计算为utils::data
,从而导致错误。这说明问题很清楚,但我想不出解决办法
我需要将整个DT[…]
表达式替换为by
才能正常工作(请参见或)。但是我不能用整个表达式替换未被替换的DT
这个困境的解决方案是什么?将NSE从图片中删除对于这个特定的示例非常有效,并且简化了很多事情。但是,您应该将参数作为字符串传递:
count_by <- function(DT, id_var, val_var, by = NULL) {
DT[!is.na(get(val_var)), .(distinct_ids = uniqueN(get(id_var))), by = by]
}
wrapper <- function(data, id_var, val_var, by = NULL) {
count_by(data, id_var, val_var, by)
}
wrapper(sample_dt, id_var = "id", val_var = "x", by = "year")
# year distinct_ids
# 1: 2018 2
# 2: 2019 2
# 3: 2020 3
count\u by@chinsoon12,非常感谢!你几乎做到了!我仍然需要将id\u-var
和val\u-var
转换为字符,然后在调用data.table
时get()
将它们转换为字符,否则,将字符串传递给id\u-var
和val\u-var
将不起作用
但是,在更高层次上进行评估是必要的关键思想。以下是完整答案,供将来参考:
#定义内部函数
按[1]计数\u为真
相同(包装(样品编号,x,c(“年份”)),参考)
#>[1]是的
相同(包装(样本编号,“id”,“x”,“年份”),参考)
#>[1]是的
相同(包装(样本编号,“id”,“x”,c(“年份”)),参考)
#>[1]是的
相同(包装(样本编号,“x”,年份),参考)
#>[1]是的
相同(包装(样本编号,“x”,“年份”),参考)
#>[1]是的
相同(包装(样本编号,“x”,c(“年份”)),参考)
#>[1]是的
相同(包装(样本编号,id,x,“年份”),参考)
#>[1]是的
相同(包装(样本编号、id、x、c(“年份”)),参考)
#>[1]是的
#通过在中测试表达式
包装纸(样本编号,“id”,x,由=(2019年=年份>2019L))
#>2019年独立识别码
#>1:错2
#>2:对3
由(v0.3.0)创建于2020-02-20,如果您总是将变量参数作为字符串传递,那么生活将变得更轻松,取代了eval(替换(…)
。我同意,但这样就不可能通过get()将2019年
之类的表达式传递到中,对吗?您可以使用get()
直接在字符串上:DT还没有部分地想到get()
ingby
。但是,by
是有点固定的,我不能轻易地通过year==2019
而不改变函数。这是必要的。我想让by
像在data.table中一样直接使用。但它不适用于by=“year>2019”
,不过。。。我需要灵活性。我可以知道为什么您需要as.character(替换(
)?是因为您需要所有的案例才能工作吗?确切地说。我希望用户可以在提供带引号的参数和不带引号的参数之间自由选择。