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)。次に、値の 2 番目のレイヤーを作成し、組み合わせのテーブル全体に対して 2 番目の関数を実行します。


改造、動かない
いずれにせよ、ケースに応じて2つの異なる機能を持たせたいと思っています。これが私が試したことです:

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()私はまた、2番目の関数内で分割を試みました:

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