wrapr包qc()函数与向量配合使用异常问题咨询
解决wrapr::qc()替换c()时出现"object 'dtest' not found"的问题
问题场景
你遇到的问题是:用wrapr::qc()替换原本正常运行的c()函数后,代码抛出了Error in eval(ei): object 'dtest' not found的错误。先看一下你的代码对比:
可正常运行的代码(使用c())
library(wrapr) library(data.table) dtest <- data.table(x=1:10,y=letters[1:10]) for (i in 1:nrow(dtest)){ print(paste(i,c(dtest[i,2]))) } #> [1] "1 a" #> [1] "2 b" #> [1] "3 c" #> [1] "4 d" #> [1] "5 e" #> [1] "6 f" #> [1] "7 g" #> [1] "8 h" #> [1] "9 i" #> [1] "10 j"
报错的代码(使用qc())
library(wrapr) library(data.table) #> Attaching package: 'data.table' #> The following object is masked from 'package:wrapr': #> := dtest <- data.table(x=1:10,y=letters[1:10]) for (i in 1:nrow(dtest)){ print(paste(i,qc(dtest[i,2]))) } #> Error in eval(ei): object 'dtest' not found
原因分析
问题出在qc()函数的核心设计上:它是引用式拼接函数(quoting concatenate),作用是把输入的表达式直接转换成字符串,而不会对表达式求值。比如:
c(dtest[i,2])会先计算dtest[i,2]的实际值(比如循环第一次的"a"),再把这个值传入paste();- 而
qc(dtest[i,2])会直接返回字符串"dtest[i,2]",当paste()尝试处理这个字符串时,内部的求值逻辑会把它当成一个变量名去查找,自然找不到名为dtest[i,2]的对象,最终抛出错误。
简单说,qc()不是c()的替代品,它的适用场景是生成列名、符号名这类字符串向量(比如qc(x,y)等价于c("x","y"),常用于data.table的列选择),而不是用来获取变量的实际值。
解决方案
如果你只是想获取dtest[i,2]的实际值并传入paste(),那直接继续使用c()就可以了——这本来就是c()的正确用法。
如果想让代码更简洁,也可以直接省略c(),因为dtest[i,2]本身就是单个值,不需要拼接:
library(wrapr) library(data.table) dtest <- data.table(x=1:10,y=letters[1:10]) for (i in 1:nrow(dtest)){ print(paste(i, dtest[i,2])) }
这段代码和你最初用c()的版本效果完全一致。
额外说明
如果你想了解qc()的正确用法,比如用它来选择data.table的列,可以参考这个例子:
# 使用qc()生成列名字符向量,选择dtest的x和y列 dtest[, qc(x, y), with=FALSE]
内容的提问来源于stack exchange,提问作者Lazarus Thurston
相关产品推荐
相关产品推荐

