gpt4 book ai didi

r - 存在并应用 : why are these functions different?

转载 作者:行者123 更新时间:2023-12-04 07:52:37 26 4
gpt4 key购买 nike

为什么两个函数fngn下面有什么不同?我不认为他们应该是,但我一定是错过了什么。

vars <- letters[1:10]
a <- b <- 1
fn <- function (d) {
sapply( vars, exists )
}
gn <- function (d) {
sapply( vars, function (x) { exists(x) } )
}
fn(d=2)
# a b c d e f g h i j
# TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
gn(d=2)
# a b c d e f g h i j
# TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
exists("i")
# [1] FALSE

有两个区别:
  • gn(d=2)d存在,但为什么不 fn(d=2) ?
  • fn(d=2)i存在,当 gn(d=2)才不是。这很令人费解,因为我没有定义i任何地方。

  • 注意:这是在 R 版本 3.2.0 上,似乎第二个行为是该版本的新行为(见下文)。

    最佳答案

    为什么i是不同的...
    看起来 R 3.2 发生了变化。一个索引变量i已经added to the current environmentlapply (这是 sapply 实际调用的内容)。这与新行为一起强制评估传递给您正在应用的函数的参数。这意味着您现在可以访问循环中当前迭代的索引。
    原因fngn表现不同的是 exists()在调用它的环境中查找。在 fn 的情况下,也就是这个i的环境变量已创建。在 gn 的情况下,它正在查看您的匿名函数的环境。当 R 在本地环境中找不到符号时,它会根据定义函数的位置而不是调用它们的位置来搜索环境。这意味着 R 将找不到 i变量,因为您的匿名函数是在 i 的位置定义的。变量不存在。
    我们可以编写一个小辅助函数来更容易地获取当前索引。

    idx <- function() get("i", parent.frame(2))
    sapply(letters[1:3], function(x) paste(idx(), x))
    # a b c
    # "1 a" "2 b" "3 c"
    据我所知,这是目前未记录的行为。它可能会在 R 的 future 版本中发生变化。
    为什么 d是不同的...
    d 的差异变量是一个更直接的范围问题。 R 再次创建了一个新环境,用于调用函数 exists。 .此环境的父级是基础环境。所以当你调用 exists它看起来是从哪里调用它的(这是存在 i 的环境),因为它没有找到 d在那里,它搜索作为基础环境的下一个父级。从不搜索当前函数环境。您可以使用显式搜索当前环境
    fn <- function (d) {
    sapply( vars, exists, where=environment() )
    }
    fn(d=2)
    # a b c d e f g h i j
    # TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    有关 R 环境的更多信息,我建议您阅读 Environments section of Advanced R

    关于r - 存在并应用 : why are these functions different?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30880605/

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