R:" ["函数的行为与命名的#34; foo"相同。

时间:2014-10-09 08:54:13

标签: r data.table

你能解释一下为什么命名这个功能" ["改变它的行为,如下例所示。?

library(data.table)

d <- data.table(data.frame(a=1:10))
class(d) <- c(class(d), "bar")

foo <- function(data, x) {
  data[, .(.N), keyby=eval(substitute(x), envir=data)]
}

"[.bar" <- function(data, x) {
  data[, .(.N), keyby=eval(substitute(x), envir=data)]
}

结果:

   > d[a < 5]
   a
1: 1
2: 2
3: 3
4: 4
> foo(d, a < 5)
   substitute N
1:      FALSE 6
2:       TRUE 4

> foo(d, a)
    substitute N
 1:          1 1
 2:          2 1
 3:          3 1
 4:          4 1
 5:          5 1
 6:          6 1
 7:          7 1
 8:          8 1
 9:          9 1
10:         10 1
> d[a]
Error in eval(expr, envir, enclos) : object 'a' not found

他们的工作方式应该相同,不是吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

这两个输出相同。

> foo(d, a<5 )
   substitute V1
1:      FALSE  6
2:       TRUE  4

> "[.bar"(d,a<5)
   substitute V1
1:      FALSE  6
2:       TRUE  4

请说明您正在谈论的行为更改。

答案 1 :(得分:1)

好的,我发现问题归功于已经删除了他/她的回复的人:

class(d) <- c("bar")

foo <- function(data, x) {
  data <- unclass(data)
  data <- as.data.table(data)
  data[, .(.N), keyby=eval(substitute(x), envir=data)]
}

"[.bar" <- function(data, x) {
  data <- unclass(data)
  data <- as.data.table(data)
  data[, .(.N), keyby=eval(substitute(x), envir=data)]
}

如你所见,这是课堂上的问题。