R中函数外部的对象范围

时间:2019-07-07 07:48:45

标签: r scope global-variables getter-setter rscript

下面,我将以一种简单的方式来解释我所面临的问题。

  • 我在两个文件中有两个R脚本-file1.Rfile2.Rfile1.R包含函数function1()

  • file2.R中包含多个构造函数定义-constructor1(p1, p2)constructor2(p3, p4)等。这些构造函数的实例用于{{1 }}。因此,我将function1()作为file1.R的第一行。

  • source("file2.R")中,file1.R使用file2.Rconstructor2(p1 = rep(1,length(object1)), p2)创建的object1。

function1()的整体结构如下:

file1.R

file2.R的总体结构如下:

file1.R

如何在source("file2.R") function1 <- function() { #Read data data <- readData() # Second parameter for this function is a instance of constructor1 that is present in file2.R object1 <- somefunction1(data, listObject$constructor1) # Second parameter for this function is a instance of a constructor2 that is present in file2.R # Constructor 2 uses object1 as an input parameter (shown in file2.R) object2 <- somefunction2(object1, listObject$constructor2) } 之外定义# List object listObject <- list() #Instance of constructor 1 listObject$constructor1 <- constructor1(p1 = someValue, p2 = someValue) #Instance of constructor 2 # This is where problem lies. How do I access object1 here? listObject$constructor2 <- constructor2(p3 = rep(1,length(object1)), p4 = someValue) 的范围?我试图在R中使用getter和setter来实现此目的,但是却遇到object1错误。我想这个错误的产生是因为我在function1()node stack overflow之前source("file2.R")function1()file1.R之前。如果没有这个,我会在R读取source("file1.R")时收到一个file2.R错误。

1 个答案:

答案 0 :(得分:1)

该问题与object1的范围无关,它与无限循环有关

source("function1.R") > source("function2.R") > source("function1.R") > etc

第一个示例重现该错误。


# file: function1.R

source("function2.R")

function1 <- function(){
    object1 <- 1:10
    function2(p1 = object1, p2 = 2)
}

# file: function2.R

source("function1.R")

function2 <- function(p1, p2){
    p1 + p2
}

在干净的R会话中运行:

source("function1.R")
  

错误:节点堆栈溢出

现在从第二个文件function2.R中删除行source("function1.R")

# new file: function2.R

function2 <- function(p1, p2){
    p1 + p2
}

再次在干净的R会话中运行:

source("function1.R")
function1()
#[1]  3  4  5  6  7  8  9 10 11 12

function1范围内创建的对象可以毫无问题地传递到function2