加载插入符号命名空间调用随机函数?

时间:2016-10-13 16:33:12

标签: r r-caret

在加载caret包的命名空间时,我发现以下情况:

# 1.
set.seed(1)
print(rnorm(1))           # -0.6264538

# 2. Restart R session

# 3.
set.seed(1)
loadNamespace('caret')
print(rnorm(1))           # -0.3262334

# 4. Restart R session

# 5.
loadNamespace('caret')
set.seed(1)
loadNamespace('caret')
print(rnorm(1))           # -0.6264538

当我为加载caret命名空间的某些函数编写单元测试代码时,这给我带来了麻烦。一个例子如下:

档案R/abn.R

abn <- function(){
  requireNamespace('caret')
  round(rnorm(1), 5)
}

档案tests/testthat/test_abn.R

context("Test abnomality")

test_that("Anomaly situation", {
  requireNamespace('caret') # Without this line, devtools::check() will fail
                            #   abn() not equal to -0.62645.
                            #   1/1 mismatches
                            #   [1] -0.326 - -0.626 == 0.3
  set.seed(1)
  expect_equal(abn(), -0.62645)
})

您可以看到我的解决方案。

我在这里想念一下吗?

有没有可靠的方法来避免这种情况?

或者,这种解决方法可能会帮助遇到类似问题的人。

1 个答案:

答案 0 :(得分:1)

你真的没有错过任何东西。 question has come up before并且它与某些包创建随机启动消息有关。我花了一段时间来跟踪它。