R中使用data.table时如何确保自定义函数的参数类型正确
问题原因
你遇到的两个报错本质都是data.table环境下的非标准评估传参问题:
- 第一个报错是因为你调用函数时传入未加引号的
Northeast,R会默认在全局环境中搜索名为Northeast的对象,而它只是你数据里的分类值,不是全局对象,因此找不到。 - 第二个报错是你直接传入未加引号的列名
Region时,eval函数默认在父环境搜索,找不到data内部的列对象。
解决方案
提供两种可选方案,你可以根据自己的调用习惯选择:
方案1:保持当前不加引号的调用方式
调整函数代码,用substitute和bquote捕获传入的符号,在data.table的内部环境中求值:
topx_engagement = function(state_of_engagement, respondent_variable, respondent_variable_sub, rank_length = 3){ # 捕获传入的未加引号的参数符号 resp_col <- substitute(respondent_variable) resp_val <- substitute(respondent_variable_sub) engage_col <- substitute(state_of_engagement) # 构造表达式在data.table内部求值 data[eval(bquote(.(resp_col) == .(resp_val))), mean(eval(engage_col), na.rm = TRUE), by = Product][order(-rank(V1))][1:rank_length,.(Product)] }
你原来的调用代码不用修改:
topx_engagement(state_of_engagement = Awareness, respondent_variable = Region, respondent_variable_sub = Northeast, rank_length = 3)
方案2:参数传字符串(更稳妥,不容易踩坑)
调整函数逻辑,所有列名、分类值都传字符串,用get获取对应列的值:
topx_engagement = function(state_of_engagement, respondent_variable, respondent_variable_sub, rank_length = 3){ data[get(respondent_variable) == respondent_variable_sub, mean(get(state_of_engagement), na.rm = TRUE), by = Product][order(-rank(V1))][1:rank_length,.(Product)] }
调用时所有参数加引号即可:
topx_engagement(state_of_engagement = "Awareness", respondent_variable = "Region", respondent_variable_sub = "Northeast", rank_length = 3)
内容的提问来源于stack exchange,提问作者Okin_97
相关产品推荐
相关产品推荐

