感谢@BrianDiggs,我正在修改一些以前的代码:[](
这是我的可重现代码,因为我的实际代码使用数据文件,并且基于各种 ifelse 案例涉及更多。这会产生相同的错误:
一、未修改和工作
library(plyr)
df <- data.frame(name = LETTERS[1:3], var1 = c(1,5,10), var2 = c(2, 4, 6))
generator <- function(name, var1, var2) {
function(varA, varB) {
ifelse(varA + varB < 10,
10,
100)
}
}
funs <- mlply(df, generator)
interactions <- expand.grid(one = seq(0, 20, by=5), two = seq(0, 20, by=5))
table <- ldply(funs, function(f) {
data.frame(varA=interactions$one, varB=interactions$one,
result=f(interactions$one, interactions$two))
})
我完全不明白plyr
......但它的工作原理。根据我的最佳猜测,我创建了输入值,然后 plyr 创建了一种对象,其中包含函数定义(funs
)。然后我创建我的第二层值并在整个组合表上运行第二个函数。
修改,不工作
无论如何,我想根据情况有两个不同的功能。这是我尝试过的:
library(plyr)
df <- data.frame(name = LETTERS[1:3], var1 = c(1,5,10), var2 = c(2, 4, 6))
generator <- function(name, var1, var2) {
ifelse(name == "A",
function(varA, varB) {
ifelse(varA + varB < 10,
10,
100)
},
function(varA, varB) {
varA + varB
})
}
funs <- mlply(df, generator)
interactions <- expand.grid(one = seq(0, 20, by=5), two = seq(0, 20, by=5))
table <- ldply(funs, function(f) {
data.frame(varA=interactions$one, varB=interactions$one,
result=f(interactions$one, interactions$two))
})
为此,我得到,Error: Object of type 'closure' is not subsettable
我还尝试在ifelse()
第二个函数中进行拆分:
library(plyr)
df <- data.frame(name = LETTERS[1:3], var1 = c(1,5,10), var2 = c(2, 4, 6))
generator <- function(name, var1, var2) {
function(varA, varB) {
ifelse(name == "A",
"foo",
ifelse(varA + varB < 10,
10,
100))
}
}
funs <- mlply(df, generator)
interactions <- expand.grid(one = seq(0, 20, by=5), two = seq(0, 20, by=5))
table <- ldply(funs, function(f) {
data.frame(varA=interactions$one, varB=interactions$one, result=f(interactions$one, interactions$two))
})
为此,我得到In '[<-.factor'('*tmp*', ... : invalid factor level, NAs generated
.
如果我替换ifelse(name == "A")
为ifelse(0 < 1)
,我会如预期的那样得到所有结果foo
。如果我用 替换ifelse(name == 1)
,我得到的所有结果都是 10,这很奇怪,因为在很多情况下varA + varB > 10
.
df
有趣的是,我在of 中添加了另一列criteria = c(1, 5, 10)
。我做不到ifelse(criteria > 1)
,但我可以ifelse(varA > criteria)
。为什么它不允许与静态数字进行比较,但允许在行变量之间进行比较?
无论如何,我希望能够做这样的事情:
generator <- function(var1, var2, ... , varN) {
function(varA, varB) {
ifelse(criteria based on any of var1 ... varN,
do a bunch of stuff,
do different stuff if criteria not met)
}
}