我的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
在最后一个花括号之前似乎有效。
答案 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之外。