2

私はまだ R に不慣れで、以前の同様の投稿について読んだことがあります...これは、r が値ではなく約束を渡すという事実と関係があると思いますが、ここでどこが間違っていたのかはっきりしません..

試してみたいコードの簡単なバージョンは次のとおりです。

定義:

data<-data.frame(TYPE=as.integer(runif(20,1,3)),COL1=runif(20,1,100),COL2=runif(20,1,10))
RULEA=10
RULEB=20

私は次のように実行しています:

f<-function(data,metric="A"){
  data<-ddply(data,.(TYPE),transform,SUMCOL1=sum(COL1,na.rm=TRUE),SUMCOL2=sum(COL2,na.rm=TRUE))
  data1<-f1(data=data,metric=metric)
  return(data1)
}

f1<-function(data=data,metric="A"){
  if(metric=="A"){
    RULE<-RULEA
    data$FACTOR<-data$COL1
  }else if(metric=="B"){
    RULE<-RULEB
    data$FACTOR<-data$COL1
  }
  if(nrow(data!=0)){
    x<-subset(data,FACTOR>1)
    if(nrow(x)!=0){
      x<-ddply(x,.(TYPE),mutate,sig=(max(FACTOR)>2*min(FACTOR)) & min(FACTOR) < RULE)
    }
  }

 return(x)
}

そして、次のように実行すると: f(data,metric="A")

それは私に結果を与えるでしょう:

> f(data,metric="A")
Error in eval(expr, envir, enclos) : object 'RULE' not found

なぜ「RULE」が見つからなかったのかわかりません....?ご協力ありがとうございました!

4

3 に答える 3

2

この(古い) 議論によると、これは実際には非常に難しい問題です。

そのディスカッション ノートのように、 で式を評価するポイントに到達するまでにmutateddplyは にハンドオフされ、 はldplyにハンドオフされllplyます。そして今mutate、その表現のすべてがどこから来たのかを突き止めなければなりません。それほど単純ではないようです。

1 つの (恐ろしい) 回避策は、 の割り当てRULEを useに変更すること<<-です。ハドリーは、その議論の中で、より安全なオプションであるかもしれない明示的な関数を書くことに言及しています。

于 2013-04-03T21:40:28.097 に答える
2

data.tableこれは、この問題を回避するために役立つ可能性のあるアプローチです。

関数が通常の R 関数のように動作するように、各関数内で data.tables を明示的にコピーしていることに注意してくださいj。より速くなるddply)。

一般に data.table、あなたが望むことを行うためのより良い方法がありますが、この答えは実際にはそうではありません。

f<-function(DT,metric="A"){
  ## explicit copy to avoid assignment in global `DT`
  dd <- copy(DT)
  ## add sum columns to local copy
  dd[, c('SUMCOL1', 'SUMCOL2') := lapply(.SD, sum ,na.rm = TRUE),by = 'TYPE', .SDcols = c('COL1','COL2')]
  # do f1 on dd
  dd1<-f1(DT = dd,metric=metric)
  # return results
  return(dd1)
}


f1<-function(DT,metric="A"){
  ## explicit copy
  ddd <- copy(DT)
  # assign RULE (a bit simpler)
  RULE <-  switch(metric, 'A' = RULEA, 'B' = RULEB)
  # i FACTOR didn't depend on metric
  ddd[, FACTOR := COL1]
  # subset
  x <- ddd[FACTOR >1, ]

  x[, sig :=(max(FACTOR)>2*min(FACTOR)) & min(FACTOR) < RULE ,by = 'TYPE']
  return(x)
}

f(data.table(data),metric="A")
于 2013-04-03T23:13:03.140 に答える