R eval(as.name(paste0())包装函数,用于编程数据.table更改

R eval(as.name(paste0())包装函数,用于编程数据.table更改,r,function,data.table,eval,R,Function,Data.table,Eval,我想在R中模拟STATA的本地宏。 基本上,假设我有一个data.table,它有许多具有相同起始字符串但不同结束字符串的变量;我想以编程方式更改它。我知道您可以使用eval(as.name(x))实现这一点,但是在我的代码中多次使用eval会让我很忙。 有人能解决这个问题吗 e、 g 库(data.table) a你很接近。我认为一个简单的方法是: nms作为一个注意事项,您可能想查看这个挂起的PR,它将引入一种更通用的数据表查询编程方式,因此这些是新功能,将在下一版本的data.table中

我想在R中模拟STATA的本地宏。 基本上,假设我有一个data.table,它有许多具有相同起始字符串但不同结束字符串的变量;我想以编程方式更改它。我知道您可以使用eval(as.name(x))实现这一点,但是在我的代码中多次使用eval会让我很忙。 有人能解决这个问题吗

e、 g

库(data.table)

a你很接近。我认为一个简单的方法是:


nms作为一个注意事项,您可能想查看这个挂起的PR,它将引入一种更通用的数据表查询编程方式,因此这些是新功能,将在下一版本的data.table中发布。顺便说一句,这将非常棒。你的工作真让人惊讶。让我们保守地说“即将出版的版本”这太棒了!没有想到要用拉普拉。对不起,你知道为什么sa不能马上开始吗。我在元编程方面做得不够直观(在元之外这样做是相当直接的,所以我坚持)。是的,我认为如果你操作整个data.table,lapply往往是一个很好的解决方案,但我觉得它会让人困惑(至少对我来说)在处理data.table的切片时…我并不反对。我防止这种情况的方法是使用
.SDcols
并将其捕获到名称向量中(
(nmsout)
)。例如,
DT[,c(“aa”,“bb”):=(1,2)]
做了人们可能期望的事情(至少我做了:-),我倾向于坚持这种命名法和结构。一旦你发现
(…)
只是
列表(…)
,那么
lappy
似乎更有意义,因为它总是返回一个
列表。
library(data.table)    
a <- data.table(bob_1 = c(1:3), bob_2 = c(1:3), bob_3 = c(1:3))


# this works
for (i in c(1:3)){
  a[,(paste0("bob_",i)):=eval(as.name(paste0("bob_",i))) + 1]
}
a <- as.data.table(a)
print(a)

# this also works
a <- data.table(bob_1 = c(1:3), bob_2 = c(1:3), bob_3 = c(1:3))

for (i in c(1:3)){
  a[,(paste0("bob_",i)):=.SD + 1, .SDcols = (paste0("bob_",i))]
}

a <- as.data.table(a)
print(a)

# but this doesn't

sa <- function(...) {eval(as.name(paste0(...)))}

a <- data.table(bob_1 = c(1:3), bob_2 = c(1:3), bob_3 = c(1:3))

for (i in c(1:3)){
  a[,(paste0("bob_",i)):=sa("bob_",i) + 1]
}
# <<error message>>
a <- as.data.table(a)
print(a)