我在R包中创建了一个函数,它接受了几个参数。其中一个参数是R data.table的列名。
我们想说我想创建一个包含所有值42
的列。对于R data.table dt
,我会这样做:
dt[, column_name:=42]
对于R data.frame,我会这样做:
df$column_name = 42
我希望函数能够将定义为column_name
的参数作为参数。例如,
func
func(dt, col='hey')
会将hey
作为data.table列的新名称传递。
这是一个具体的例子
renamer = function(colname, dt){
## do calculations on dt
dt[, colname:= 42]
}
如果我调用函数renamer(colname = 'foo', dt=dt)
,结果列名仍然是colname
,而不是我传递的值,' foo'。
新列应为字符串' foo'
我怎么能这样做?我也尝试使用R data.frame,或尝试使用
setnames(dt, "oldname", "newname")
编辑:我认为应该澄清这个问题:
这是data.table:
> library(data.table)
> DT = data.table(ID = c("b","b","b","a","a","c"), a = 1:6, b = 7:12, c = 13:18)
> DT
ID a b c
1: b 1 7 13
2: b 2 8 14
3: b 3 9 15
4: a 4 10 16
5: a 5 11 17
6: c 6 12 18
我想创建一个函数,使列的新名称成为用户传递它的字符串。
e.g。
colnamer = function(newcolumname, datatable){
## do calculations on dt
## create a column with whatever string is passed via 'newcolumnname'
}
如果用户拨打colnamer('foobar', DT)
,我希望结果为
> DT
ID a b c foobar
1: b 1 7 13 ...
2: b 2 8 14 ...
3: b 3 9 15 ...
4: a 4 10 16 ...
5: a 5 11 17 ...
6: c 6 12 18 ...
答案 0 :(得分:1)
编辑:更改为OP的新可重复示例,其中两条建议符合OP的问题陈述;
library(data.table)
DT <- data.table(ID = c("b","b","b","a","a","c"),
a = 1:6, b = 7:12, c = 13:18)
colnamer1 <- function(newcolumname, datatable) {
## do calculations on dt
## create a column with whatever string is passed via 'newcolumnname'
set(datatable, j = newcolumname, value = 42)
}
colnamer2 <- function(newcolumname, datatable) {
## do calculations on dt
## create a column with whatever string is passed via 'newcolumnname'
dt[, (newcolumname) := 42]
}
colnamer1("name_me", DT)
colnamer2("name_me_too", DT)
DT
# ID a b c name_me name_me_too
# 1: b 1 7 13 42 42
# 2: b 2 8 14 42 42
# 3: b 3 9 15 42 42
# 4: a 4 10 16 42 42
# 5: a 5 11 17 42 42
# 6: c 6 12 18 42 42
可能的data.frame
解决方案?虽然自从data.table
采用data.frame
后,我的data.frame
有点生疏了。对于df <- data.frame(ID = c("b","b","b","a","a","c"),
a = 1:6, b = 7:12, c = 13:18)
df_colnamer <- function(name_me, df) {
new_df <- df
new_df[[name_me]] <- 42
new_df
}
new_df <- df_colnamer("foo", df)
new_df
# ID a b c foo
# 1 b 1 7 13 42
# 2 b 2 8 14 42
# 3 b 3 9 15 42
# 4 a 4 10 16 42
# 5 a 5 11 17 42
# 6 c 6 12 18 42
。
data_dir = "/Users/leon/Projects/inpainting/data/"
images = []
files = glob.glob (data_dir + "*.jpg")
for file in files:
image = cv2.imread(file, 0)
images.append(image)