如何编写一个R函数来确保我们得到的是一个变量,而不是一个data.table的col?
R码 f2是一个删除如何编写一个R函数来确保我们得到的是一个变量,而不是一个data.table的col?,r,data.table,R,Data.table,R码 f2是一个删除xI的新函数,我刚刚意识到OP是从函数的封闭环境中获取x,而不是将其作为参数传递。我认为这是一个糟糕的做法,并没有真正的建议。如果这个答案太分散注意力,我可能会删除它(它只包括将x传递给函数) 详细输出表明fs创建索引,这有助于提高速度。请参阅vignette(“数据表二级索引和自动索引”) ,可能有语法,所以我们可以简单地编写 fs = function(x, ...){ e = substitute(x == ..x, list(..x = x)) dt[eva
xI的新函数,我刚刚意识到OP是从函数的封闭环境中获取x
,而不是将其作为参数传递。我认为这是一个糟糕的做法,并没有真正的建议。如果这个答案太分散注意力,我可能会删除它(它只包括将x
传递给函数)
详细输出表明fs
创建索引,这有助于提高速度。请参阅vignette(“数据表二级索引和自动索引”)
,可能有语法,所以我们可以简单地编写
fs = function(x, ...){
e = substitute(x == ..x, list(..x = x))
dt[eval(e), ...]
}
fs(4L, verbose = TRUE)
# Creating new index 'x'
# Starting bmerge ...done in 0 secs
# x y
# 1: 4 4
# 2: 4 8
# 3: 4 12
fs(3L, verbose = TRUE)
# Using existing index 'x'
# Starting bmerge ...done in 0 secs
# x y
# 1: 3 3
# 2: 3 7
# 3: 3 11
出于安全考虑,可能使用链接中建议的inherits=TRUE
参数(因此x
必须是一列,并且(i)x
必须存在于父环境中,或者.x
必须是一个列名).我刚刚意识到OP是从函数的封闭环境中获取x
,而不是将其作为参数传递。我认为这是一个糟糕的做法,并没有真正的建议。如果这个答案太分散注意力,我可能会删除它(它只包括将x
传递给函数)
详细输出表明fs
创建索引,这有助于提高速度。请参阅vignette(“数据表二级索引和自动索引”)
,可能有语法,所以我们可以简单地编写
fs = function(x, ...){
e = substitute(x == ..x, list(..x = x))
dt[eval(e), ...]
}
fs(4L, verbose = TRUE)
# Creating new index 'x'
# Starting bmerge ...done in 0 secs
# x y
# 1: 4 4
# 2: 4 8
# 3: 4 12
fs(3L, verbose = TRUE)
# Using existing index 'x'
# Starting bmerge ...done in 0 secs
# x y
# 1: 3 3
# 2: 3 7
# 3: 3 11
出于安全考虑,可能使用链接中建议的inherits=TRUE
参数(因此x
必须是一列,并且(i)x
必须存在于父环境中,或者.x
必须是一个列名)。@Frank,谢谢!基于这篇文章,我写了一个函数:
dt[..x == x]
弗兰克,谢谢!基于这篇文章,我写了一个函数:
dt[..x == x]
`..`我发现旧的解决方案不适用于数据。表1.11.4,我编写了一个新的解决方案:
current_frame <- sys.nframe()
dt <- data.table()
dt[, sys.nframe() - current_frame]
我发现旧的解决方案不适用于数据。表1.11.4,我编写了一个新的解决方案:
current_frame <- sys.nframe()
dt <- data.table()
dt[, sys.nframe() - current_frame]
。。我认为.x
语法不是一个好主意,因为.x
可以是一个合法变量。我们可能无法理解…a
或…a
@liqg3的含义是的,这是一个很好的观点。如果/wheninherits=TRUE
是一个选项,那么唯一的要求就是.x
不是一个列名(这样它会在x
中搜索“上一级”)。您对问题的编辑应该/可以作为答案发布在这里。感谢您的回答,这是我第一次看到data.table的辅助键,它在大数据操作中非常有用。我认为.x
语法不是一个好主意,因为.x
可以是一个合法变量。我们可能无法理解…a
或…a
@liqg3的含义是的,这是一个很好的观点。如果/wheninherits=TRUE
是一个选项,那么唯一的要求就是.x
不是一个列名(这样它会在x
中搜索“上一级”)。您对问题的编辑应该/可以作为答案发布在这里。感谢您的回答,这是我第一次看到data.table的副键,它对大数据操作非常有帮助。
dt[..x == x]
`..` <- function(x){
stopifnot(inherits(x, "character"))
stopifnot(length(x)==1)
get(x, parent.frame(4))
}
x <- 4
f1 <- function(){
x <- 1
dt <- data.table(x=1:4,y=1:12)
dt[x==..("x")]
}
f1()
f2 <- function(){
#x <- 1
dt <- data.table(x=1:4,y=1:12)
dt[x==..("x")]
}
f2()
current_frame <- sys.nframe()
dt <- data.table()
dt[, sys.nframe() - current_frame]
.. <- function (x, env = parent.frame())
{
stopifnot(inherits(x, "character"))
stopifnot(length(x) == 1)
get(x, envir = parent.env(env))
}
x <- 4
f1 <- function(){
x <- 1
dt <- data.table(x=1:4,y=1:12)
dt[x==..("x")]
}
f1j <- function(){
x <- 1
dt <- data.table(x=1:4,y=1:12)
dt[, ..("x")]
}
f2 <- function(){
#x <- 1
dt <- data.table(x=1:4,y=1:12)
dt[x==..("x")]
}
f2j <- function(){
#x <- 1
dt <- data.table(x=1:4,y=1:12)
dt[,..("x")]
}
stopifnot(all(f1()$y==c(1,5,9)))
stopifnot(all(f1j()==c(1)))
stopifnot(all(f2()$y==c(4,8,12)))
stopifnot(all(f2j()==c(4)))