我想要一个编写的函数,该函数期望数据帧与数据表一起使用,就像它们是数据帧一样;例如,无论参数d[, j]
是数据帧还是数据表,我都希望d
做同样的事情。
我知道data.table:::cedta
中使用[.data.table
来检测是否应启用数据帧兼容模式。如何针对特定功能将其强制启用?
答案 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
,然后只能使用一种语法。