2012-01-30 2 views
2

代入演算子なしで呼び出すことができるRの初期化置換メソッドをいくつか持っています。例えばので代入なしのRでのメソッドの設定

私はsetNode(o)を呼び出し、setnode(o) <- c("foo", "bar")などのようなものを呼び出すことなく、オブジェクトoのスロットを交換できるようにしたいと思います。私がこれをやりたいのは、ユーザーがその割り当ての詳細を意識することなく、これらの中にいくつかのインタラクティビティ(例えば、select.list)を入れたいからです。

これは可能ですか?

+0

多分、私はRから本当に欲しいOOの種類を使用していません。むしろ閉鎖を望んでいます。http://www.lemnica.com/esotericR/Introducing-Closures/もっと見ると、これはもっと詳しく調べられます... –

+0

私を捨てている行に沿ったもう一つのことは、私が何かを設定したときに、特定の「プライベート」スロットを設定したいということです。だから私はメソッドを呼び出すときに、これらのプライベートスロットを変更することがあります –

+1

またはおそらく私はR5が欲しい:https://github.com/hadley/devtools/wiki/R5/bba2424a052f6a9d8bc893a2dfaf9dc178e14ee6 –

答えて

2

私は本当にあなたのユースケースを理解しますが、していない...構文

よう
o <- setNode(o, c("foo", "bar")) 

あなたがねじれを通過していない場合は、Rの通常のコピー・オン・変更のルールに従いますし、 oのスロット値を置き換えるのではなく、oのコピーを作成してください。交換方法

node(o) <- c("foo", "bar") 

更新oを適所に置きます。私はsetNodeではなくnodeを使用しています。その設定は暗黙的に使用されているためです。例えばnode<-は、オブジェクト構造に関連する何かをしなければならないことを言って何も、私はこれがあなたの欲求にどのように関連するかわからないんだけど

setClass("Node", representation(n="integer", value="character"), 
     prototype=prototype(n=0L)) 
setGeneric("node<-", function(x, ..., value) standardGeneric("node<-")) 
setReplaceMethod("node", "Node", function(x, ..., value) { 
    [email protected] <- [email protected] + 1L 
    [email protected] <- toupper(value) 
    x 
}) 

、その後

> o <- new("Node") 
> o 
An object of class "Node" 
Slot "n": 
[1] 0 

Slot "value": 
character(0) 

> node(o) <- c("foo", "bar") 
> o 
An object of class "Node" 
Slot "n": 
[1] 1 

Slot "value": 
[1] "FOO" "BAR" 

「私が欲しいありませんいくつかのインタラクティブ性であること。あなたは

> do.call("node<-", list(x=o, value=c("foo", "bar"))) 
An object of class "Node" 
Slot "n": 
[1] 2 

Slot "value": 
[1] "FOO" "BAR" 

として、より多くのコールに似た構文を持っていたコードを書くことができますが、これはnode(o) <- ...異なる何もしていません。

参照クラス(これはS4の上に構築されているので、setOldClassのようなS4-ismsがここに当てはまる)を選択して、提供されたインタフェースではなくクラスのコンテンツに適している。たとえば、データベース上の単一のエンティティだけが対話しているため、参照クラスにはデータベース接続が適している可能性があります。ほとんどの場合、参照クラスを使用すると、コピー時変更のセマンティクスを期待するRユーザーを混乱させます。

+0

私はそれが見えるように参照クラスをしたいと思う私はこのすべてがうまくいくようにしています。しかし、今私は、S4でS3を使用していたところで、RODBCオブジェクトを参照クラスのフィールドとして含める方法についてちょっと固執しているようです。それは 'Error in inherits(channel、" RODBC ")" object ".self"を返すようです。見つからない」 –

+0

私の以前のコメントを無視して、私のRセッションはどうにかして差し押さえられました。私がこのメソッドに加えた変更を認識していませんでした。 –

関連する問題