Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何在嵌套函数中将所有可能的信息传递给i、j和by?_R_Data.table_Non Standard Evaluation - Fatal编程技术网

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()
ing
by
。但是,
by
是有点固定的,我不能轻易地通过
year==2019
而不改变函数。这是必要的。我想让
by
像在
data.table中一样直接使用。但它不适用于
by=“year>2019”
,不过。。。我需要灵活性。我可以知道为什么您需要
as.character(替换(
)?是因为您需要所有的案例才能工作吗?确切地说。我希望用户可以在提供带引号的参数和不带引号的参数之间自由选择。