data.table
还是新手,并与环境合作。
我有data.table
与此相似(虽然大得多):
mydt <- data.table(ID = c("a", "a", "a", "b", "b", "b"),
col1 = c(1, 2, 3, 4, 5, 6),
col2 = c(7, 8, 9, 10, 11, 12),
key = "ID")
我写了一个带mydt
的函数,用它的键将它在data.table
列表中拆分,然后在data.table
列表中的每个表中取列,用户在参数中指定并将其乘以用户在另一个参数中提供的数字:
myfun <- function(data, constant, column) {
data <- split(x = data, by = key(data))
data <- lapply(data, function(i) {
i[ , (column) := get(column)*constant]
})
return(data)
}
x <- myfun(data = mydt, constant = 3, column = "col1")
x
$a
ID col1 col2
1: a 3 7
2: a 6 8
3: a 9 9
$b
ID col1 col2
1: b 12 10
2: b 15 11
3: b 18 12
如果我正确理解R中的范围规则lapply
将查看其所调用的环境,则会发现column
和constant
作为myfun
的参数提供并将使用它们。
但是,传递给lapply
的函数比这里传递的函数要长得多,而且它将更多地用于除了分割data.table
之外的许多其他函数。这就是为什么我想将此部件定义为将在其他函数中调用的外部函数。这就是我所做的:
split.dt <- function(data) {
split(data, by = key(data))
}
mult <- function(data) {
lapply(data, function(i) {
i[ , (column) := get(column)*constant]
})
}
myfun <- function(data, constant, column) {
data <- split.dt(data = data)
data <- mult(data = data)
}
x <- myfun(data = mydt, constant = 3, column = "col1")
返回错误:
Error in eval(expr, envir, enclos) : object 'column' not found
我尝试将column
i[ , eval(column)]
i[ , eval(column)]
与mult
函数一起包裹parent.frame()
parent.env()
和sys.call
,但没有成功。最后,我找到了一个解决方案,我使用myfun
来获取在列表中传递给mult
的参数,并在split.dt <- function(data) {
split(data, by = key(data))
}
mult <- function(data) {
supplied.col <- sys.call(which = -1)[["column"]]
supplied.constant <- sys.call(which = -1)[["constant"]]
lapply(data, function(i) {
i[ , eval(supplied.col) := get(supplied.col)*supplied.constant]
})
}
myfun <- function(data, constant, column) {
data <- split.dt(data = data)
data <- mult(data = data)
}
x <- myfun(data = mydt, constant = 3, column = "col1")
x
$a
ID col1 col2
1: a 3 7
2: a 6 8
3: a 9 9
$b
ID col1 col2
1: b 12 10
2: b 15 11
3: b 18 12
中使用它们,如下所示:
mult
它确实有效,但我不确定是否:
myfun
查看提供给XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("cmn", "http://fake.com/schemas/common");
XmlSerializer serializer = new XmlSerializer(load.GetType());
serializer.Serialize(stringwriter, load, ns);
的参数的方法是什么?答案 0 :(得分:2)
1)只需将column
和constant
传递给mult
作为其他参数。
mult <- function(data, constant, column) {
lapply(data, function(i) {
i[ , (column) := get(column)*constant]
})
}
myfun <- function(data, constant, column) {
data <- split.dt(data = data)
data <- mult(data, constant, column)
}
2)或者将mult
定义为:
mult <- function(data, envir = parent.frame()) with(envir,
lapply(data, function(i) {
i[ , (column) := get(column)*constant]
})
)
2a)或
mult <- function(data, envir = parent.frame()) {
constant <- envir$constant
column <- envir$column
lapply(data, function(i) {
i[ , (column) := get(column)*constant]
})
}