r语言 - 如何在数据内部引用函数参数.具有相同名称的列的表?



这里,我有一个数据。表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数据。要在
  • 上操作的表
  • t一个值t,可用于dt的子集(当然是在t上)

我的问题是,在我的子集操作dt <- dt[J(t = t), by = "t"]中,我不知道如何使R引用函数变量t作为第二个t。我尝试了dt <- dt[J(t = get(t, -1)), by = "t"]的变体,没有运气。

我知道我可能应该改变我的函数变量名,但实际上它们非常冗长和具体,我宁愿不这样做。还要注意,实际上,myfunc()是一个复杂的绘图函数。

  1. 一个可能的选择是:
myfunc <- function(dt, t){
env <- environment()
dt <- dt[t==get('t',env)]
mean(dt$b)
}
  1. 另一种方法:虽然可能不是严格意义上的"解决方案";对于你目前的问题,你可能会感兴趣。考虑data.tableversion>= 1.14.3。在本例中,我们可以使用DT[i,j,by,env,...]env参数,表示数据表列为"t",函数参数为t。注意,即使dt包含名为colval
  2. 的列,这也适用于函数参数为tt列。
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

歧义不是基本函数-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.tablej-calls中的作用域和环境(作为第二个参数计算的表达式)与常规r中的不同。

最新更新