R

时间:2016-05-11 14:56:44

标签: r variables scope global-variables local-variables

我最近一直在努力消除我的R技能,而且我在这个特定的代码中遇到了变量范围的困难。

所以我的函数循环在这里调用程序中的其他函数,这些函数当前工作没有任何问题,调用年份和试验(两个整数)和simMat(数字矩阵)。我的主要问题在于矩阵simMat。我希望能够从命令行调用它并查看值,但每当我这样做时,我将获得一个NAs矩阵,我不知道为什么。我几乎是积极的,这与变量范围有关,但我对此并不十分熟悉。此外,抑制警告是摆脱强制的消息(不知道很多,任何建议都赞赏)

我希望能够从命令行调用simMat并将其传递给另一个函数来进行一些算术运算。我非常感谢有关如何实现这一目标的任何帮助!!!

#This looks the same for the func asking for the num of years and trials
numTrials <- function()
{ 
  trials<- readline(prompt="How many trials? ")
  trials<- as.integer(trials)
  if (is.na(trials)){
    trials<- readinteger()
  }
  return(trials)
}

#Do the simple cash flow simulation
loop<-function(trials, years)
{
  trials<-suppressWarnings(numTrials())
  years<-suppressWarnings(numYears())
  simMat<-matrix(nrow=trials, ncol=years)
  for (i in 1:trials){
    sim <- newCashFlow[1]
    for (j in 1:years){
      simMat[i,j]<-sim
      random<-randomRates(cholMat2)
      sim = sim + sum(random*newCashFlow[j]*weights)
    }
  }
  simMat
  plotSimulation(simMat,years,i)
}

1 个答案:

答案 0 :(得分:0)

如果您打算从R的控制台访问在全局环境中运行的内容,那么您需要在该环境中创建该函数的变量OUTSIDE。在此环境中它将持续存在。循环功能已完成其任务。

为了能够在循环之外使用矩阵simMat,请在那里创建它。

此外,在执行此操作之前,请在代码中运行以下脚本以查看每个变量的位置。这将有助于您了解进行更改时会发生什么。

Sys.getenv(c("simMat", "trials", "years", "sim"))

或只是使用parent.env(simMat)

调用环境

这个网站非常适合解释这些环境问题。

Hadley Wickham...R Genius!

More Hadley Wickha Genius on Lexical Scoping & Functions

这两个网站应该让你过去!