【问题标题】:Vectorized R function to produce sets of histograms用于生成直方图集的矢量化 R 函数
【发布时间】:2023-03-18 12:18:01
【问题描述】:

我有一个矢量化的 R 函数(见下文)。每次运行时,该函数都会绘制两个直方图。我的目标是当参数n 是一个向量时(参见下面的使用示例),该函数绘制n 的这些直方图的单独集合的长度(例如:如果n 是一个长度为2 的向量,我期望两组直方图,即 4 个单独的直方图)?

我尝试了以下但没有成功。有没有办法做到这一点?

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

【问题讨论】:

  • 它是一个向量,但是函数以某种方式运行输入两次,因此每次迭代中长度 n 为 1,您可以通过在函数内部打印 length(n) 来测试它,并且您还可以得到两组图1.
  • 我认为没有比将par(mfrow = c(2, 2) 放在函数之外并在函数中删除它更简单的方法来解决这个问题。通过更改,它将始终为 1

标签: r function plot histogram


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2019-10-18
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多