0

Rで非常に単純なことをしたいのですが、一連の関数で簡単にパラメーター化できるアルゴリズムがあります。ダックタイプのオブジェクトのようなことができると確信していました。非常に単純なコードに示されているアイデアは次のとおりです。

par1.generate <- function(n) {
  runif(n, min=0, max=1000)
}

par1.mean <- function(vec) {
  mean(vec)
}


par2.generate <- function(n) {
  round(runif(n, min=0, max=1000))
}

par2.mean <- function(vec) {
  mean(vec, trim=0.2)
}

#the "algorithm"

alg <- function(par) {
  v <- par.generate(10)
  par.mean(v)
}

alg(par1)
alg(par2)

このコードを実行しようとすると、次のようになります。

alg(par1)のエラー:関数"par.mean"が見つかりませんでした

ですから、私の直感的なアプローチはうまくいかないと思います。

そのようなことをするRの方法は何ですか?タスクは単純なので、構文はできるだけ単純にすることをお勧めします。抽象クラスなどは使用しないでください。

4

3 に答える 3

2

別のオプションは、関数のリストを使用することです。

par1 <- list(generate=par1.generate,mean=par1.mean)
par2 <- list(generate=par2.generate,mean=par2.mean)

alg <- function(par) {
  v <- par$generate(10)
  par$mean(v)
}

alg(par1)
[1] 495.2501
alg(par2)
[1] 481
于 2013-03-25T21:00:47.997 に答える
1

名前を文字列として使用match.funして渡します。

alg <- function(par) {
    v <- (match.fun(paste(par,"generate",sep=".")))(10)
    (match.fun(paste(par,"mean",sep=".")))(v)
}

私は得る:

# > alg("par1")
# [1] 615.5656
# > alg("par2")
# [1] 509

式や記号を使用する、つまり言語での計算など、より洗練されたオプションがいくつかあります。あなたがそのようなことに興味があるかどうか教えてください、そして私たちはもっと助けることができます。

于 2013-03-25T20:49:44.127 に答える
1

S3スタイルの関数ディスパッチは、確かにダックタイピングをいくらか思い出させます。ジェネリック関数名(以下の例では「sound」)を定義し、クラスごとに異なる関数をオーバーライドできます。引数のクラス属性に応じて、Rは適切な関数を選択します。特に、Rの関数ディスパッチメカニズムの中心であるUseMethodについて読んでください。

http://www.r-bloggers.com/the-s3-oop-system/からの例:

# Set up dispatch for the generic function sound: 
sound <- function(x) UseMethod("sound", x)

# Methods are defined with a naming convention: method.class:
# This defines the method sound on class dog:
sound.dog <- function(x) "bark"
# Same for cow:
sound.cow <- function(x) "moo"
# Fallback:
sound.default <- function(x) "animal sound"

# The methods function can find out which classes a generic function was designed for:
> methods("sound")
[1] sound.cow     sound.default sound.dog

# R looks for methods in the order in which they appear in the class vector until it found the appropriate method to operate on.
# This makes multiple-inheritance possible

> x <- structure("cat", class = c("cat", "dog", "cow"))
> sound(x)
[1] "bark"

しかし、あなたはRが持っていない言語機能を望んでいるように私には思えます。Rは風変わりで、時々物事を行うためのきれいな方法がないことがあります。

于 2013-03-25T21:03:10.383 に答える