【问题标题】:Object scope outside a function in RR中函数之外的对象范围
【发布时间】:2019-07-07 07:48:45
【问题描述】:

下面我将尝试以简单的方式解释我面临的问题。

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

  • file2.R 在其中包含多个构造函数定义 - constructor1(p1, p2)constructor2(p3, p4) 等。这些构造函数的实例在 function1() 中使用,存在于 file1.R 中。所以,我使用source("file2.R") 作为file1.R 的第一行。

  • file2.R 中,constructor2(p1 = rep(1,length(object1)), p2) 使用由function1()file1.R 中创建的object1。

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)

}

file2.R的整体结构如下:

# 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)


我应该如何定义object1function1()之外的范围?我尝试在 R 中使用 getter 和 setter 来实现这一点,但我得到了 node stack overflow 错误。我想这个错误源于我在file1.Rfile2.R 中的function1()source("file1.R") 之前source("file2.R")。没有这个,只要 R 读取 source("file2.R"),我就会收到 object1 not found 错误。

【问题讨论】:

  • 两个文件中都有source?看来你很复杂。这是可重现的。我建议你 source 只在一个文件中(文件 function1.R)。
  • getter-setter 函数在文件 function1.R 中,getter 函数在文件 function2.R 中使用。那么这是如何工作的呢?
  • 只需构建一个包...
  • @Roland 不确定这会有什么帮助
  • 你会在一个命名空间中自然地提供所有东西......

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


【解决方案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

【讨论】:

  • 感谢这个例子。这里看起来很简单,但是当我尝试在我的 R 项目中执行此操作时,我得到object not found 错误。我将编辑问题功能以添加更多详细信息。
  • @novicegeek 发布一个重现错误的minimal 示例。很多时候,问题中包含太多不需要重现问题的代码,这可能会分散注意力并吓跑回答者。
  • 我已经编辑了这个问题。抱歉,我在最初的描述中使用了术语 function(),而它是一个构造函数。我希望它现在更清楚。如果没有,我将尝试生成一个最小的示例。
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
相关资源
最近更新 更多