R - 如何将data.table的环境传递给函数?

时间:2017-07-04 19:30:46

标签: r function data.table

我想这样做:

例如,我有一个data.table as:

dt <- data.table(a=1:3, b=5:7, c=10:8)
#   a b  c
#1: 1 5 10
#2: 2 6  9
#3: 3 7  8

我希望每次将一行的环境传递给一个函数,例如:

f <- function(a,b,c){
    x <- a*b
    y <- a*c
    z <- a/b

    return( x + y + z)
}

我知道我可以在这种情况下使用mapply来解决这个多变量函数,但在我真正的需要中我有一个函数可以操作几乎 150变量的data.table,并且我不想一个一个地分配变量的名字。我也尝试了一些.SD操纵,但它也没有用。

我希望我传递data.table行的数量,并在函数内部获取对象 a b c 在data.table环境中。

类似的东西:

f <- function(row_id){
    # set function parent env as data.table[row_id]
    # and *a = data.table[row_id, a]* and successively to b and c...

    x <- a*b
    y <- a*c
    z <- a/b

    return( x + y + z)
}

1 个答案:

答案 0 :(得分:1)

一种方法是调整函数以接收给定的data.table和一行并输出x + y + z

f <- function(dataTable,row_id){
    a <- dataTable[row_id,a]
    b <- dataTable[row_id,b]
    c <- dataTable[row_id,c]

    x <- a*b
    y <- a*c
    z <- a/b

    return( x + y + z)
}

如果您输入f(dt),它会为您提供x+y+z个值,或者如果您给它f(dt,1),它将仅返回第一行的值。

修改 假设您的列名是要分配的变量名,可以尝试这样:

f <- function(dataTable,row_id){

    for(i in colnames(dataTable)){
        assign(paste(i,"",sep=""), dataTable[row_id,..i])
    }

    x <- a*b
    y <- a*c
    z <- a/b

    return( x + y + z)
}