我有data.table
library(data.table)
testDT <- data.table(
L = (1:32),
M = rep(letters[23:26], each = 64),
N = rep(LETTERS[1:2], times = 2, each = 512),
O = rnorm(2048, 1))
testDT$L <- factor(testDT$L, levels = seq(from = 1, to = 32, by = 1))
我创建了一个有条件地对数据集进行子集化的函数。如果子集变量G
为NULL
且H
为"w"
,那么我希望testDT$N
中的所有值和"w"
中的所有值testDT$M
要在testDT
中返回1}}。这就是我创建的,它无法正常运行:
G <- NULL
H <- "w"
testDT1 <- testDT[if(is.null(G)) {eval(call("%in%", as.name("N"), G))} &
if(is.null(H)) {eval(call("%in%", as.name("M"), H))}]
我确认除了if(is.null())
部分以外的所有内容都可以通过创建它来正常工作,这正确地设置了子集:
G <- "A"
H <- "w"
testDT1 <- testDT[{eval(call("%in%", as.name("N"), G))} &
{eval(call("%in%", as.name("M"), H))}]
如何正确使用is.null()
条件?
答案 0 :(得分:3)
使用语言计算,您可以使用专用函数准备http://127.0.0.1:8080/test/some-module.js
http://127.0.0.1:8080/static/test/some-module.js
个对象。
call
如果您始终按两个条件和library(data.table)
testDT = data.table(
L = factor(1:32),
M = rep(letters[23:26], each = 64),
N = rep(LETTERS[1:2], times = 2, each = 512),
O = rnorm(2048, 1)
)
i.expr = function(var, x){
if(is.null(x)) TRUE
else call("%in%", as.name(var), x)
}
G = NULL
H = "w"
i.expr("N",G)
#[1] TRUE
i.expr("M",H)
#M %in% "w"
testDT1 = testDT[eval(i.expr("N",G)) & eval(i.expr("M",H))]
G = "A"
H = "w"
i.expr("N",G)
#N %in% "A"
i.expr("M",H)
#M %in% "w"
testDT2 = testDT[eval(i.expr("N",G)) & eval(i.expr("M",H))]
运算符进行子集化。我会将它合并为一个函数,因此您可以使用&
调用它一次。