如何引用具有同名列的 data.table 中的函数参数?

问题描述 投票:0回答:2

这里,我有一个data.table

foo

foo <- data.table(t = c(1,1,2,2,3), b = rnorm(5))
foo
   t           b
1: 1  0.07014277
2: 1  1.71144087
3: 2 -0.60290798
4: 2 -0.47216639
5: 3 -0.63537131

和一个函数,

myfunc()

myfunc <- function(dt, t){
  # Subset dt by t, then do stuff

  dt <- dt[J(t = t), by = "t"]
  
  # Complicated stuff here..
  score <- mean(dt$b)
  
  return(score)
}

myfunc()
有两个参数:

  • dt
    要操作的data.table
  • t
    t 的值,可用于对
    dt
    进行子集化(当然是在 t 上)

我的问题是,在我的子集操作

dt <- dt[J(t = t), by = "t"]
中,我不知道如何让R引用第二个t的函数变量t。我尝试过
dt <- dt[J(t = get(t, -1)), by = "t"]
的各种变体,但没有成功。

我知道我可能应该更改我的函数变量名称,但实际上它们非常冗长和具体,我宁愿不这样做。另请注意,实际上,

myfunc()
是一个复杂的绘图函数。

r data.table
2个回答
1
投票
  1. 一个可能的选择是:
myfunc <- function(dt, t){
  env <- environment()
  dt <- dt[t==get('t',env)]
  mean(dt$b)
}
  1. 另一种方法:虽然严格来说可能不是您当前问题的“解决方案”,但您可能会发现它很有趣。考虑
    data.table
    版本 >= 1.14.3。在这种情况下,我们可以使用
    env
    DT[i,j,by,env,...]
    参数,将数据表列表示为
    "t"
    ,将函数参数表示为
    t
    。请注意,这将适用于具有函数参数
    t
    的列
    t
    ,即使
    dt
    包含名为
    col
    val
  2. 的列
myfunc <- function(dt, t){
  dt <- dt[col==val, env=list(col="t", val=t)]
  mean(dt$b)
}

在这两种情况下,用法和输出如下:

使用方法

myfunc(dt = foo, t = 3)

输出:

[1] 0.1292877

输入:

set.seed(123)
foo <- data.table(t = c(1,1,2,2,3), b = rnorm(5))

foo
看起来像这样:

> foo
   t           b
1: 1 -0.56047565
2: 1 -0.23017749
3: 2  1.55870831
4: 2  0.07050839
5: 3  0.12928774

0
投票

歧义不在于基函数-

t
与名为“t”的列的级别。它位于名为
t
的参数级别和名为
t
> 的列> 这是一个成功的修改函数(至少如果之前有 setkey(foo, "t") 操作:

myfunc <- function(dt, d){
    # Subset dt by t, then do stuff
    
    dt1 <- dt[ t==d]
    
    # Complicated stuff here..
    score <- dt1[ , paste(b, collapse="_")]
    
    return(score)
}

 myfunc(foo, d=1)
#[1] "a_b"

显然我需要想出一个对字符变量列有意义的内部函数。这似乎解决了您在名为“t”的列中遇到的明显问题。只需将函数参数列表中的参数名称更改为“t”以外的名称即可。

data.table
j 调用(作为第二个参数计算的表达式)中的范围和环境与常规 R 中不同。

© www.soinside.com 2019 - 2024. All rights reserved.