将包提交给 CRAN 不接受函数内部的 set.seed 但不知道如何避免它
Submitting a package to CRAN does not accept set.seed inside a function but do not know how to avoid it
我正在向 CRAN 提交一个包,用于识别时间序列中的中断,为此我在包的某些功能中进行了蒙特卡洛模拟。为了保证执行 Montecarlo 模拟的函数的相同输入得到相同的结果,我在函数中设置了一个种子。 CRAN 版主高我:"Please do not set a seed to a specific number within a function."
问题是如果没有设置种子,如何使用相同的输入获得相同的结果。这是一个理解问题的例子,其中 function2
在里面设置了一个种子,结果总是相等比较 max2
和 max4
,而不是 funtion1
做同样的事情但是未设置种子,结果各不相同。
x <- c(1:100)
#Function without set.seed
function1 <- function(x,simulations = 100){
mn <- mean(x)
sd <- sd(x)
max_vect <- vector(mode = 'double',length = simulations)
for(i in 1:simulations){
x_aux <- rnorm(n = length(x),mean = mn,sd = sd)
max_vect[i] <- max(x_aux)
}
return(mean(max_vect))
}
#Function that set.seed
function2 <- function(x,simulations = 100){
mn <- mean(x)
sd <- sd(x)
max_vect <- vector(mode = 'double',length = simulations)
set.seed(1234)
for(i in 1:simulations){
x_aux <- rnorm(n = length(x),mean = mn,sd = sd)
max_vect[i] <- max(x_aux)
}
return(mean(max_vect))
}
max1 <- function1(x)
max2 <- function2(x)
max3 <- function1(x)
max4 <- function2(x)
同意评论。这样做
myFunction <-function (x, y,z, seed = NULL) {
if (length(seed) ) set.seed(seed)
# the function guts
}
我正在向 CRAN 提交一个包,用于识别时间序列中的中断,为此我在包的某些功能中进行了蒙特卡洛模拟。为了保证执行 Montecarlo 模拟的函数的相同输入得到相同的结果,我在函数中设置了一个种子。 CRAN 版主高我:"Please do not set a seed to a specific number within a function."
问题是如果没有设置种子,如何使用相同的输入获得相同的结果。这是一个理解问题的例子,其中 function2
在里面设置了一个种子,结果总是相等比较 max2
和 max4
,而不是 funtion1
做同样的事情但是未设置种子,结果各不相同。
x <- c(1:100)
#Function without set.seed
function1 <- function(x,simulations = 100){
mn <- mean(x)
sd <- sd(x)
max_vect <- vector(mode = 'double',length = simulations)
for(i in 1:simulations){
x_aux <- rnorm(n = length(x),mean = mn,sd = sd)
max_vect[i] <- max(x_aux)
}
return(mean(max_vect))
}
#Function that set.seed
function2 <- function(x,simulations = 100){
mn <- mean(x)
sd <- sd(x)
max_vect <- vector(mode = 'double',length = simulations)
set.seed(1234)
for(i in 1:simulations){
x_aux <- rnorm(n = length(x),mean = mn,sd = sd)
max_vect[i] <- max(x_aux)
}
return(mean(max_vect))
}
max1 <- function1(x)
max2 <- function2(x)
max3 <- function1(x)
max4 <- function2(x)
同意评论。这样做
myFunction <-function (x, y,z, seed = NULL) {
if (length(seed) ) set.seed(seed)
# the function guts
}