【问题标题】:R - How pass the environment of a data.table to a function?R - 如何将 data.table 的环境传递给函数?
【发布时间】:2017-07-04 19:30:45
【问题描述】:

我想这样做:

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

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 来解决这个多元函数,但在我真正需要的时候,我有一个函数可以操纵 data.table 的几乎 150 个变量,我不知道'不想一一分配变量的名称。我也尝试了一些.SD 操作,但也没有用。

我想要一些我传递 data.table 行数的东西,并在函数内部获得对象 abc 在 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)
}

【问题讨论】:

    标签: r function data.table


    【解决方案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)
    }
    

    【讨论】:

    • 这个问题是我会手动分配 150 个变量,我想做一些更简单的事情,比如当程序查找它直接从 dt[row_id] 环境中获取的 a 值时.
    • @RafaelToledo,看看上面的编辑是否能满足你的要求。
    • 它完成了任务,但它仍然不是我想要的。我意识到一种更类似于我想要在函数开头使用attach(dt[row_id]) 和最后使用detach(dt[row_id]) 的解决方案。这对我有帮助,但我认为这可以做得更恰当。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多