2015-06-21 129 views
1

我是新来R的超出了我的代码如下。我有一个简单的范围问题。范围问题。访问对象if语句

我认为,任何局部变量来创建如我的if语句只有声明中的范围是什么?我仍然可以访问if语句之外的Buy.Signal。这怎么样?

我的代码

library(Quandl) 
library(TTR) 
library(mail) 

RunProgram <- function() { 

    Buy.Signal <- EMAFind() 

} 
EMAFind <- function() { 

    Quandl.auth("TOKEN") 

    mydata <- Quandl("BCHARTS/BITSTAMPUSD") 
    mydata <- mydata[1:30, ] 
    mydata <- mydata[order(mydata$Date), ] 

    EMA.Short <- EMA(x = mydata$Close, 11) 
    EMA.Long <- EMA(x = mydata$Close, 21) 

    if (tail(EMA.Short, 1) > tail(EMA.Long, 1)) { 

    Buy.Signal = TRUE 

    } else { 

    Buy.Signal = FALSE 

    } 

print (Buy.Signal) #<- WORKS! 

} 

回答

2

没有,这是关于可变范围C(和C++)和R之间的主要区别之一。在R上的if语句,后跟{支架不限制内声明的变量范围。

if(x==1) 
    { y<-2}  # assigned in .GlobalEnv 
else (x==2) 
    {y <-3}  # assigned in .GlobalEnv 

y 

>2  # or 3 of course 

fun <- function(x) { 
     varfun <- 3 # assigned in the function environment 
     } 

varfun  #we are back in the .GlobalEnv 

>Error: object varfun not found 

这里是R中http://adv-r.had.co.nz/Environments.html

+0

为什么是一个很好的链接的环境?在任何其他情况下(例如当声明一个函数时)范围应用,而不是if语句?像这样的R有更多的情况吗? – uncool

+1

是的,范围(用于与'<-'操作初始化变量)是它已被宣布为环境和环境if'同所有'或'for'声明它们是否属于相同的功能。我将编辑答案使其更加清晰。 – RDGuida

+1

@uncool Techically讲,R使用词法/静态作用域代替动态作用域。你可以在这里找到一个视频可能给你R上的工作空间,环境,确定范围和功能定义的一些更深入的了解:https://www.youtube.com/watch?v=WCu1Xw4h_n8 –