如何编写一个R函数来确保我们得到的是一个变量,而不是一个data.table的col?

如何编写一个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

R码

f2是一个删除
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的含义是的,这是一个很好的观点。如果/when
inherits=TRUE
是一个选项,那么唯一的要求就是
.x
不是一个列名(这样它会在
x
中搜索“上一级”)。您对问题的编辑应该/可以作为答案发布在这里。感谢您的回答,这是我第一次看到data.table的辅助键,它在大数据操作中非常有用。我认为
.x
语法不是一个好主意,因为
.x
可以是一个合法变量。我们可能无法理解
…a
…a
@liqg3的含义是的,这是一个很好的观点。如果/when
inherits=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)))