R:x中的错误必须是数字

ano*_*ova 0 statistics r distribution

我尝试在r中编写程序"使用函数从任何分布生成随机样本".但它显示"hist.default(xbars)中的错误:'x'必须是数字"我的程序在这里

sim.clt <- function(n, ran.func,..., simsize,...)
{
  xbars<-vector()
  for(i in 1:simsize=simsize)
  {
    x<-function(ran.func)

      xbars[i]<-mean(x)
 }
par(mfrow=c(2,1))
hist(xbars)
qqnorm(xbars)
return(xbars)
}
sim.out<-sim.clt(n=20,ran.func="rexp",simsize=5000)
shapiro.test(sim.out)
Run Code Online (Sandbox Code Playgroud)

#

我是r编程的新手,所以无法弄明白,如何解决问题.谢谢...

Rei*_*son 6

这里有很多错误.

for(i in 1:simsize=simsize)
Run Code Online (Sandbox Code Playgroud)

应该抛出一个错误:

> for(i in 1:simsize=simsize) { print(i)}
Error: unexpected '=' in "for(i in 1:simsize="
Run Code Online (Sandbox Code Playgroud)

更好的是

for(i in seq_len(simsize))
Run Code Online (Sandbox Code Playgroud)

然后

x <- function(ran.func)
Run Code Online (Sandbox Code Playgroud)

没有做你想象的那样; 它返回一个函数xbars[i]<-mean(x)作为它的主体,如:

> x <- function(ran.func)
+ 
+       xbars[i]<-mean(x)
> x
function(ran.func)

      xbars[i]<-mean(x)
> is.function(x)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

我想你想打电话,ran.func所以你可能需要

FUN <- match.fun(ran.func)
x <- FUN()
Run Code Online (Sandbox Code Playgroud)

但是这会失败,因为你似乎没有通过任何论证ran.func去工作,即使只是n在使用的例子中rexp.

错误消息源于最后一点.您定义xbars为空vector(),默认情况下创建一个空逻辑向量:

> xbars <- vector()
> xbars
logical(0)
> is.numeric(xbars)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

现在,如果您没有在定义中出现错误x(xbars[i]<-mean(x)现在在函数体中调用x并且从未显式调用过),这就不会成为问题,这意味着xbars仍然是一个空的逻辑向量.由于这不是数字,因此hist会抛出您看到的错误.

另一个错误是您无法...在函数定义中使用两次.您是否尝试将第一个包含参数传递给ran.func第二个包含其他内容的参数....你不能在R中做到这一点

这是你想要的吗?

sim.clt <- function(n, ran.func, simsize, ...) {
  ## ... passed to ran.func for other parameters of distribution
  xbars <- numeric(simsize)
  for(i in seq_len(simsize)) {
    FUN <- match.fun(ran.func)
    x <- FUN(n = n, ...)
    xbars[i] <- mean(x)
  }
  ## plot
  op <- par(mfrow=c(2,1))
  on.exit(op)
  hist(xbars)
  qqnorm(xbars)
  xbars
}

> sim.out<-sim.clt(n=20,ran.func="rexp",simsize=5000)
> shapiro.test(sim.out)

    Shapiro-Wilk normality test

data:  sim.out
W = 0.9867, p-value < 2.2e-16
Run Code Online (Sandbox Code Playgroud)