2016-11-14 82 views
1

写入时功能的环境中,如果它被赋予一个data.table的名字下面的函数会工作可以这样调用:当写我自己的功能,我怎么能“继承”的data.table

library(data.table) 
irisDT <- data.table(iris) 
myDelta(irisDT) 

然而,这有几个问题:

  1. 分配输出到一个新的对象将工作,BU t原来被修改的地方,所以这可能是一个尴尬的副作用
  2. 我不假设(虽然我没有测试过),这是使用所有数据中的最好的。桌面花式色牢度
  3. 这没有使用'data.table方式',这将更多irisDT[, myDelta()],但是因为它期望DT参数是data.table,所以我通过编写irisDT[, myDelta(irisDT)]来重复自己。

明确,我想知道: 我缺少什么写功能,这使他们能够从他们被称为中,而不必从提供的data.table对象data.table对象继承函数参数

另外我很好奇: 在这种用例中,编写一个可以从内部或外部调用data.table对象的函数是一种最佳实践,其目标是计算对象中现有列的输出列。你只写一个或另一个?

虽然我可能会完全倒退,如果有的话请让我知道。

+0

我不明白你究竟在问什么。你的目标是什么?让你的功能正常工作,但不改变输入? – Roland

+0

我的功能正如我期望的那样工作,但是,我觉得我写得很糟糕。我对data.table的理解是,你调用函数来修改'[i,j,by,等....]'的j参数内的表。例如我可以通过'IrisDT [,sum(Sepal.Width)''调用'Sepal.Width'列,但不在'sum()'中写表名,但是,对于我以上的函数不起作用。 'irisDT [,myDelta()]'给出myDelta()中的错误:参数“DT”丢失,没有默认值。我希望我的函数在data.table中使用时不必重新指定表名。 – DaveRGP

+1

请注意'sum'如何不分配列。你不能在引用data.table的时候在函数内部使用':='(或'set')。 – Roland

回答

1

[i, j, by, .SDcols]所选的data.table子集应用函数。例如:

myDelta2 <- function(x, baseline = 5) { 
    return(x - 5) 
} 

library(data.table) 
irisDT <- data.table(iris) 
irisDT[, lapply(.SD, myDelta2), .SDcols = c("Sepal.Length", "Sepal.Width")] 

当然,这可以简单地也写为:

irisDT[, .SD - 5, .SDcols = c("Sepal.Length", "Sepal.Width")] 

或就地

irisDT[, c(paste0("delta", c("Sepal.Length", "Sepal.Width"))) := .SD - 5, .SDcols = c("Sepal.Length", "Sepal.Width")] 

建议你检查出这个优秀的resource

PS:如果你想知道.SD然后阅读this