如何使用 R 环境和 globalenv() 函数

How to use the R environment and the globalenv() function

我目前正在阅读 Hands-On Programming With R 并且作者首先建议使用此代码从一副牌的顶部发牌:

deal <- function(deck) {
deck[1,]}

但是该代码有一个明显的问题:您总是会得到同一张牌,因为该函数不会在发牌后将牌从牌组中移除。

作为解决方案,他建议使用以下代码:

deal <- function(){
  card <- deck[1,]
  assign("deck", deck[-1,], envir = globalenv())
  card

我觉得我没有正确理解 envir = globalenv() 部分发生了什么。我知道这与从牌组中移除已发牌有关,但有人可以解释一下到底发生了什么吗?

您的卡片组存储在全局环境中的矢量 deck 中。

deal <- function(){
  card <- deck[1,]
  assign("deck", deck[-1,], envir = globalenv())
  card
}

每个函数调用都会创建它自己的环境,在函数内部分配的对象“存在”在其中。这就是为什么您在全局环境中看不到名为 card 的矢量(除非您之前创建了一个,但此矢量不受 deal 函数 card <- deck[1,] 语句的影响)。

所以 assign("deck", deck[-1])(没有 envir 参数)将与

相同
deal <- function(){
  card <- deck[1,]
  deck <- deck[-1,]
  card
}

但这不会改变 deck 函数之外的功能。函数内部的向量 deck 就存在于函数内部。要在函数外更改 deck,您必须告诉 R where 更改它。所以这就是使用 assign("deck", deck[-1,], envir = globalenv()) 的原因。

那么让我们重新开始你的函数 deal:

card <- deck[1,]

deck的第一个元素赋值给card。可是等等! deck 函数中不存在?那么这怎么可能呢?如果在函数 中找不到对象,R 会向上查找一个级别,在您的情况下很可能是全局环境。所以 R 找到一个名为 deck 的 object/vector 并进行赋值。现在我们在函数内部有一个名为 card 的 object/vector。

要进一步了解,请查看 Chapter 6: Functions in Advanced R

阅读更多关于 globalenvassign 函数的信息,我发现了一些关键信息 :

  • envir是决定使用什么环境的参数
  • globalenv 函数只是让我们可以访问全局环境
  • 运行环境是

hardware and software infrastructure that supports the running of a particular codebase in real time

  • 全球环境是

the interactive workspace [...] in which you normally work

考虑到这一点,我将代码翻译成:

R, create a deal function, in which you'll first:

  1. Create an object called card - and it's value will be the first row of the object deck
  2. Remove that first row of the object deck - not only from the runtime environment, but from the global environment
  3. Return the value of the object card