0

属性のリストを含む「状況」というデータフレームがあります。

> str(situations)
'data.frame':   24 obs. of  8 variables:
 $ ID.SITUATION          : Factor w/ 24 levels "cnf_01_be","cnf_02_ch",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ ELICITATION.D         : Factor w/ 2 levels "NATUREL","SEMI.DIRIGE": 1 1 1 1 1 1 1 1 2 2 ...
 $ INTERLOCUTEUR.C       : Factor w/ 3 levels "DIALOGUE","MONOLOGUE",..: 2 2 2 2 3 3 3 3 1 1 ...
 $ PREPARATION.D         : Factor w/ 3 levels "PREPARE","SEMI.PREPARE",..: 2 2 2 2 3 3 3 3 3 3 ...
 $ INTERACTIVITE.D       : Factor w/ 3 levels "INTERACTIF","NON. INTERACTIF",..: 2 2 2 2 1 1 1 1 3 3 ...
 $ MEDIATISATION.D       : Factor w/ 3 levels "MEDIATIQUE","NON.MEDIATIQUE",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ PROFESSIONNALISATION.C: Factor w/ 1 level "PRO": 1 1 1 1 1 1 1 1 1 1 ...
 $ ID.TASK               : Factor w/ 5 levels "conference scientifique",..: 1 1 1 1 2 2 2 2 3 3 ...

このデータフレームには、特定のコーパスにサブリストがあるよりも多くの観測があります (24)

ID シチュエーション名 (cnf_01_be) は、サブリストの名前 (cnf_01_be) に対応します。

個々の属性を割り当てる方法を知っています:

attributes(corpus$cnf_01_be) = situations[1,]
attributes(corpus$cnf_02_ch) = situations[2,]

そして、特定の目的のためにそれらを取得します:

attr(corpus$cnf_01_be, "ELICITATION.D")
attr(corpus$cnf_02_ch, "ELICITATION.D")
attr(corpus$cnf_02_ch, "PREPARATION.D")

しかし、たとえば lapply を使用して、コーパス内のすべてのサブリストに属性を自動的に割り当てるにはどうすればよいですか?

私はすべての裁判が間違った方向に進んでいるように感じます:

setattr <- function(x,y) {
  attributes(x) <- situations[y,]
  return(attributes)
}

...また...

lapply(corpus,setattr)
lapply(corpus, attributes(corpus) <- situations[c(1:length(situations[,1])),])

前もって感謝します!

4

1 に答える 1

0

lapply (および同様のアプローチ) を使用する際の主な問題は、通常、対象の元のオブジェクトを変更できず、代わりに新しい構造を返すことです。したがって、リスト「コーパス」が既にあり、そのメンバーの属性を変更したいだけの場合、通常は関数内でそれを行うことはできません。

この制限を克服する 1 つの方法は、通常の代入の代わりに eval.parent() 呼び出しを使用することです。この関数は、割り当てたオブジェクトのローカル インスタンス (コピー) ではなく、親環境 (関数を呼び出した環境) で割り当て式を評価します。これを使用する場合、値を返す必要はありません。

別のオプションは、関数内でコーパス リストのローカル コピーを作成し、それにすべての属性を追加してから、関数から構造全体を返し、それを使用して古いリストを置き換えることです。リストが大きい/複雑な場合、これはおそらく賢明な選択ではありません

これを行うコードを次に示します。注 - これは醜いコードです。もっと簡単にできるかどうかはまだ検討中ですが、上記の問題のため、もっと簡単なオプションがあるかどうかはわかりません。とにかく、次のことがうまくいくことを願っています:

f = function(lname,data) {
   snames = eval.parent(parse(text=paste("names(",lname,")")))
   for (xn in snames) {
       rd = data[match(xn,as.character(data$id)),]
       if (nrow(rd)>0) {
           tmp___ <<-rd[1,]
           cmm = paste("attributes(",lname,"[[",xn,"]]) = tmp___")
           eval.parent(parse(text=cmm))
       }
   }

}

これを使用するには、リスト名 (変数ではなく文字列として) とデータ フレームを指定する必要があることに注意してください。あなたの場合、呼び出しは次のようになります。

f("corpus",situations)

これが役立つことを願っています。

于 2014-03-04T10:20:59.233 に答える