R 为什么data.table中没有“qc()”;带“=FALSE”的;论点
我正在R中使用R 为什么data.table中没有“qc()”;带“=FALSE”的;论点,r,data.table,R,Data.table,我正在R中使用wrapr包。 函数qc()非常有用,可以避免多次键入引号,例如在指定列名时。然而,一个小问题是,在Rdata.table中,当尝试使用qc()选择列名时,我们总是需要with=FALSE。data.table文档说明with=FALSE将很快被弃用。那么,什么是更好的方法呢?请参见此示例: library(wrapr) library(data.table) x <- data.table(firstcol=1:3,secondcol=letters[1:3]) x[,"
wrapr
包。
函数qc()
非常有用,可以避免多次键入引号,例如在指定列名时。然而,一个小问题是,在Rdata.table
中,当尝试使用qc()选择列名时,我们总是需要with=FALSE
。data.table文档说明with=FALSE
将很快被弃用。那么,什么是更好的方法呢?请参见此示例:
library(wrapr)
library(data.table)
x <- data.table(firstcol=1:3,secondcol=letters[1:3])
x[,"secondcol"] # works
secondcol
1: a
2: b
3: c
x[,c("secondcol")] # works
secondcol
1: a
2: b
3: c
编辑后回答
这与数据有关。表
的唯一子集(请参见?特殊符号
)。虽然可以使用with=FALSE
,但这已被记录为“不再需要”,很快可能会被弃用。我们可以采取以下措施:
x[,.SD,.SDcols = qc(secondcol)]
secondcol
1: a
2: b
3: c
回答:
如果您查看?qc
qc()一个方便的函数,允许用户删除多余的引号。它引用其参数,而不是对其求值,除非是对qc()或c()的嵌套调用。有关命名和未命名字符向量的典型用法,请参见示例
qc()使用bquote().()准旋转转义符号
它显示qc
使用bquote
,它将返回字符串noteval
uated对象。例如,见:
qc(iris)
以上内容将返回:
qc(iris)
[1] "iris"
现在,如果我们将此应用于问题,使用-qc(iris)
将正确地给出错误:
-qc(iris)中出错:一元运算符的参数无效
要解决这个问题,我们需要评估参数。我个人会使用bquote
和其他base
替代方案:
x[,-eval(bquote(firstcol))]
[1] -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
x[, qc(firstcol)]
#[1] "firstcol"
x[, -get(qc(firstcol))]
#[1] -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
# using eval(substitute(...))
x[,-eval(substitute(firstcol))]
[1] -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
# tidyverse-like
x[,-rlang::eval_tidy(firstcol)]
[1] -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
你试过了吗?我想它用错了qc
使用bquote
返回带引号的字符串,而不是对象本身。可能使用替换之类的?x[,qc(firstcol)]
似乎对我也不起作用?返回“firstcol”@BenBolker,感谢您的关注。我们现在有一个修改后的问题。我向大家道歉。这个问题需要一点改变,结果是qc()
在改变的场景中也起作用。更改with=F
插入data.table时,一元运算符起作用。我确实发现了glue和许多其他使用文本解析的方法,因此非常感谢大家。我应该删除问题还是修改它,因为with=F
不存在问题。我认为最好返回到上一个问题,并添加一个答案,说明它与with=FALSE
一起工作。我注意到with=FALSE参数在[.data.table
文档中被声明为“不再需要”。我已经修改了该问题,使其更接近问题所在。我还删除了对“一元”的引用,因为这不是根本问题。@SanjayMehrotra我已经编辑了答案,以显示当前问题的备选答案。
x[,-eval(bquote(firstcol))]
[1] -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
x[, qc(firstcol)]
#[1] "firstcol"
x[, -get(qc(firstcol))]
#[1] -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
# using eval(substitute(...))
x[,-eval(substitute(firstcol))]
[1] -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
# tidyverse-like
x[,-rlang::eval_tidy(firstcol)]
[1] -1 -2 -3 -4 -5 -6 -7 -8 -9 -10