蒙特卡洛:R脚本没有返回任何内容

时间:2015-04-26 01:16:29

标签: r

我的R脚本是

mcnorm.R <- function(M,N)
{
library("mvtnorm", lib.loc="~/R/win-library/3.2")
R <- as.matrix(read.csv("Data.csv", header=FALSE))
mu <- colMeans(R)
sigma <- cov(R)
r <- array(0,dim=c(M,ncol(R),N))
for(n in 1:N)
  {
    r[,,n] <- rmvnorm(M,mu,sigma)
  }
}

它是样本大小为M的多元正态数据的N个矩阵的蒙特卡罗模拟,其中维度由数据集确定。

但是当我打电话时

> data <- mcnorm.R(12,10)

我知道数据是空的。为什么我的代码没有返回任何内容?

编辑:通过包含

来定义全局变量
 r <<- r

在最后一个花括号之前似乎有效。

3 个答案:

答案 0 :(得分:4)

它不会返回任何内容,因为您没有为函数提供返回值。

您将一堆东西分配给局部变量,但您的函数不知道返回它。

你需要在函数末尾有一个未赋值的表达式(这是函数的值),或者明确使用return

对比这两个函数:

f1=function(x) x+1    # returns a value
f2=function(x) x=x+1  # assigns a value, doesn't return anything
'f1';f1(1)
'f2';f2(1)

现在试试这个:

f2=function(x) {
   x=x+1  # assigns a value
   x      # then gives an expression to return
}

'f2';f2(1)

答案 1 :(得分:1)

最初的问题由Glen_b回答,但似乎还有另一个问题。您设置了M,但必须通过nrow(data)从您的数据中确定。以下是快速改编。

set.seed(1237)
data <- matrix(rnorm(10 * 2), ncol = 2)
mcnorm.R <- function(data, n) {
  require(mvtnorm)
  m <- nrow(data)
  mu <- colMeans(data)
  sigma <- cov(data)

  lapply(rep(m, n), function(x) {
    rmvnorm(x, mean = mu, sigma = sigma)
  })
}

mcnorm.R(data, 2)
[[1]]
[,1]       [,2]
[1,]  0.56329623  0.4190237
[2,] -0.22289337 -0.9868659
[3,]  0.15122364  0.4912512
[4,] -0.02535081 -1.6834980
[5,]  1.55228756  0.6220963
[6,]  1.92250690  0.8586562
[7,]  0.74490463  0.8905072
[8,]  0.58680482  2.1364250
[9,] -1.77529229  0.9194059
[10,] -0.31811879  0.5085753

[[2]]
[,1]       [,2]
[1,]  0.2651033  0.9444386
[2,]  1.6429256 -0.8526075
[3,]  0.2551873  0.6049124
[4,] -0.3276499  0.9374114
[5,]  0.5807373 -2.9733458
[6,] -0.5385768 -0.8017294
[7,]  1.1536321 -0.7026208
[8,]  0.1487368  2.7005468
[9,] -1.8679594  0.7792719
[10,] -0.1405379  0.7594246

答案 2 :(得分:1)

我认为Glen-b的回答部分忽略了这一点:该功能的问题在于用户必须声明

r <- array(0,dim=c(M,2,N)) 

在全球环境中,即在函数mcnorm.R之外。