如何使用 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。
阅读更多关于 globalenv 和 assign 函数的信息,我发现了一些关键信息 :
- 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:
- Create an object called card - and it's value will be the first row of the object deck
- Remove that first row of the object deck - not only from the runtime environment, but from the global environment
- Return the value of the object card
我目前正在阅读 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。
阅读更多关于 globalenv 和 assign 函数的信息,我发现了一些关键信息 :
- 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:
- Create an object called card - and it's value will be the first row of the object deck
- Remove that first row of the object deck - not only from the runtime environment, but from the global environment
- Return the value of the object card