gpt4 book ai didi

r - 检查在 R 脚本中使用随机数生成器的函数的综合方法?

转载 作者:行者123 更新时间:2023-12-04 01:46:22 24 4
gpt4 key购买 nike

有没有一种聪明的方法来识别所有使用 .Random.seed 的函数? (R 中的随机数生成器状态)在 R 脚本中的任何位置?

用例:我们有一个不断变化的数据集,记录 [行] 和信息 [列] - 我们经常添加新记录,但我们也会更新某些列中的信息。因此数据集不断变化。我们用插补填充一些缺失的数据,这需要使用 sample() 生成随机数功能。因此,每当我们添加新行或更新列中的任何信息时,随机估算的数字都会发生变化——这是意料之中的。我们使用 set.seed()在每个随机插补开始时,因此如果一列更改但零行更改,则其他随机生成的列不受影响。

我的印象是,我们整个代码库中唯一触及随机种子的函数是sample()。功能,但我想以某种方式验证这一点?

编辑:即使是在随机数状态被触及时打印函数调用的东西也会有帮助,同样的方式 debug()每当触发被调试的功能时,它就会变得栩栩如生?出于我们的目的,假设如果我们运行一次脚本进行动态评估并且没有触发其他随机函数,那么我们是安全的。

谢谢

最佳答案

尽管有我的评论,这里有一个蛮力的检查方法:

rm(.Random.seed) # if it already exists
makeActiveBinding('.Random.seed',
function () stop('Something touched my seed', call. = FALSE),
globalenv())

这将使 .Random.seed进入 active binding触摸时会引发错误。

这行得通,但它非常具有破坏性。这是一个更温和的变体。它有几个有趣的特点:
  • 它允许启用和禁用 .Random.seed 的调试。
  • 支持获取和设置种子
  • 它记录调用但不会停止执行
  • 它维护一个不应记录的顶级调用的“白名单”

  • 有了这个,您可以编写以下代码,例如:
    # Ignore calls coming from sample.int
    > debug_random_seed(ignore = sample.int)

    > sample(5)
    Getting .Random.seed
    Called from sample(5)
    Setting .Random.seed
    Called from sample(5)
    [1] 3 5 4 1 2

    > sample.int(5)
    [1] 5 1 2 4 3

    > undebug_random_seed()

    > sample(5)
    [1] 2 1 5 3 4

    这是其所有荣耀的实现:
    debug_random_seed = local({
    function (ignore) {
    seed_scope = parent.env(environment())

    if (is.function(ignore)) ignore = list(ignore)

    if (exists('.Random.seed', globalenv())) {
    if (bindingIsActive('.Random.seed', globalenv())) {
    warning('.Random.seed is already being debugged')
    return(invisible())
    }
    } else {
    set.seed(NULL)
    }

    # Save existing seed before deleting
    assign('random_seed', .Random.seed, seed_scope)
    rm(.Random.seed, envir = globalenv())

    debug_seed = function (new_value) {
    if (sys.nframe() > 1 &&
    ! any(vapply(ignore, identical, logical(1), sys.function(1)))
    ) {
    if (missing(new_value)) {
    message('Getting .Random.seed')
    } else {
    message('Setting .Random.seed')
    }
    message('Called from ', deparse(sys.call(1)))
    }

    if (! missing(new_value)) {
    assign('random_seed', new_value, seed_scope)
    }

    random_seed
    }

    makeActiveBinding('.Random.seed', debug_seed, globalenv())
    }
    })

    undebug_random_seed = function () {
    if (! (exists('.Random.seed', globalenv()) &&
    bindingIsActive('.Random.seed', globalenv()))) {
    warning('.Random.seed is not being debugged')
    return(invisible())
    }

    seed = suppressMessages(.Random.seed)
    rm('.Random.seed', envir = globalenv())
    assign('.Random.seed', seed, globalenv())
    }

    关于代码的一些注释:
  • debug_random_seed函数是在它自己的私有(private)环境中定义的。此环境由 seed_scope 指定在代码中。这可以防止泄露私有(private) random_seed变量进入全局环境。
  • 该函数防御性地检查调试是否已启用。也许矫枉过正。
  • 只有在函数调用中访问种子时才会打印调试信息。如果用户检查 .Random.seed直接在 R 控制台上,不会发生日志记录。
  • 关于r - 检查在 R 脚本中使用随机数生成器的函数的综合方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43638773/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com