@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)
}
}