1

感谢@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)

}

}
4

0 回答 0