将功能标记为data.table-unware

时间:2018-09-25 13:47:10

标签: r data.table

我想要一个编写的函数,该函数期望数据帧与数据表一起使用,就像它们是数据帧一样;例如,无论参数d[, j]是数据帧还是数据表,我都希望d做同样的事情。

我知道data.table:::cedta中使用[.data.table来检测是否应启用数据帧兼容模式。如何针对特定功能将其强制启用?

3 个答案:

答案 0 :(得分:3)

使用setDF(和setDT):

library(data.table)

DT <- data.table(x = 1:2, y = 3:4)

foo <- function(d, j) {
  test <- is.data.table(d)
  if (test) setDF(d)
  res <- d[,j]
  if (test) setDT(d) #necessary to avoid changing DT
  res
}

foo(DT, 1)
#[1] 1 2

as.data.frame(DT)[, 1]
#[1] 1 2

DT[, 1]
#   x
#1: 1
#2: 2

答案 1 :(得分:2)

如果唯一的问题是override func viewDidLoad() { super.viewDidLoad() let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:))) let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:))) leftSwipe.direction = .left rightSwipe.direction = .right view.addGestureRecognizer(leftSwipe) view.addGestureRecognizer(rightSwipe) } @objc func handleSwipes(_ sender:UISwipeGestureRecognizer) { if (sender.direction == .left) { print("Swipe Left") // show the view from the right side } if (sender.direction == .right) { print("Swipe Right") // show the view from the left side } } 内部发生什么,则可以改为致电[.data.table

[.data.frame

我猜想可能不需要library(data.table) DT = data.table(a = 1:2, key="a") # data.table behavior `[`(DT, , 1) # a # 1: 1 # 2: 2 # data.frame behavior (function(d) base::`[.data.frame`(d, , 1))(DT) # [1] 1 2 前缀。您也可以将函数编写到非CEDTA程序包中,然后从那里加载它。

答案 2 :(得分:1)

最直接的方法是明确区分。

您可以在子句中使用类似的方法来检测传递给函数的参数的类。

a <- c(1,2,3) %>% data.table()
"data.table" %in% class(a)
#[1] TRUE
b <- c(1,2,3) %>% data.frame()
"data.table" %in% class(b)
#[1] FALSE
#  Do stuff

为避免两次编写逻辑,可以对参数应用as.data.table,然后只能使用一种语法。