我的函数找不到我正在预先赋值的对象

  • 本文关键字:对象 赋值 函数 找不到 r
  • 更新时间 :
  • 英文 :


我编写了以下函数,其中包括我已经编写的另外两个函数。

play <- function(){
got_symbols <- get_symbols()
print(got_symbols)
score()
}

当我运行play((时,它会告诉我"错误,在"unique(got_symbols("中,找不到对象got_symbols"。我写了score((,这样它就不需要任何参数,而是在它的主体中使用got_symbols(我认为这与内容无关,但我会把它展示给你们以防万一(。

score <- function(){
if ( length(unique(got_symbols)) == 1 ) {
prize <- prizes_triple[[unique(got_symbols)]]
} else {
if (all(got_symbols %in% c("BBB", "BB", "B"))){
prize <- 5
} else {
C_count <- as.character(sum( got_symbols == "C" ))
prize <- C_prizes[[C_count]]
}
}
DD_count <- sum( got_symbols == "DD")
prize*(2^DD_count)
}

我不明白为什么会发生这种情况,当我运行play((时,它会运行它的代码,直到它调用score((,它应该搜索got_symbols,但由于它的环境中没有它,它应该向上一个,它应该找到我之前分配给get_symbol((值的got_symbols,不是吗?现在,当我把got_symbols作为一个参数放在score((中时,它运行得很好,但我不明白有什么区别。如果有人能帮我,我将不胜感激。

考虑以下玩具示例:

foo <- function(){
a <- 3
bar()
}
bar <- function(){
print(a)
}

当我们运行foo()时,我们得到:

> foo()
Error in print(a) : object 'a' not found

这就是你所看到的行为。R的作用域规则区分三种变量:形式参数、局部变量和自由变量,如下所述。

在这个玩具示例中,a是函数bar中的一个自由变量。这意味着R将首先在创建函数的环境中查找R的值。这是一个微妙且经常令人困惑的事实,被称为"词汇范围界定"。

函数bar是在全局环境中创建的,因此R首先查找(然后搜索以失败告终(。

与此相比:

foo <- function(){
bar <- function(){
print(a)
}
a <- 3
bar()
}

现在bar是在一个环境中创建的(函数foo(,所以这就是R首先查找的地方,在那个环境中,a存在:

> foo()
[1] 3

最新更新