2017-09-20 3 views
0

私はベクトル化されたR関数を持っています(下記参照)。実行ごとに、この関数は2つのヒストグラムをプロットします。私の目標は、引数nがベクトルである場合(以下の使用例を参照)、関数はこれらのヒストグラムの別々のセットのnの長さをプロットします(例:が長さ2のベクトルの場合、2つのヒストグラム個々のヒストグラム)?ヒストグラムのセットを生成するベクトル化されたR関数

私は以下を試してみましたが、成功しませんでした。これを行う方法はありますか?

t.sim = Vectorize(function(n, es, n.sim){ 

    d = numeric(n.sim) 
    p = numeric(n.sim) 

    for(i in 1:n.sim){ 
    N = sqrt((n^2)/(2*n)) 
    x = rnorm(n, es, 1) 
    y = rnorm(n, 0, 1) 
    a = t.test(x, y, var.equal = TRUE) 
    d[i] = a[[1]]/N 
    p[i] = a[[3]] 
    } 
    par(mfcol = c(2, length(n))) 
    hist(p) ; hist(d) 
}, "n") 
# Example of use: 
t.sim(n = c(30, 300), es = .1, n.sim = 1e3) # `n` is a vector of `2` so I expect 
              # 4 histograms in my graphical device 
+0

それはベクトルだが何とか関数が二度入力を走る長さnは、各反復で1であるので、あなたが印字長(n)でそれをテストすることができます外に呼び出し、関数であり、1の代わりに2組のプロットが得られます。 – timfaber

+0

'par(mfrow = c(2、2)'を関数の外に置き、それを関数内で削除するより簡単な方法はないと思います。それを変更すると常に1になります – timfaber

答えて

0

Vectorizeは、基本的に入力ベクトルを循環しながら関数を何回も呼び出すmapplyに基づいているようです。したがって、簡単な方法アウトは、おそらく内部の機能

t.sim = Vectorize(function(n, es, n.sim){ 

    d = numeric(n.sim) 
    p = numeric(n.sim) 

    for(i in 1:n.sim){ 
    N = sqrt((n^2)/(2*n)) 
    x = rnorm(n, es, 1) 
    y = rnorm(n, 0, 1) 
    a = t.test(x, y, var.equal = TRUE) 
    d[i] = a[[1]]/N 
    p[i] = a[[3]] 
    } 
    # par(mfcol = c(2, npar)) 
    hist(p) ; hist(d) 
}, "n") 

#inputs  
data <- c(30,300) 
par(mfcol = c(2, length(data))) 

t.sim(n = data, es = c(.1), n.sim = 1e3) 
関連する問題