Область объекта вне функции в R - PullRequest
0 голосов
/ 07 июля 2019

Ниже я попытаюсь объяснить проблему, с которой я сталкиваюсь, в упрощенной форме.

  • У меня есть два сценария R в двух файлах - file1.R и file2.R.file1.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), использует объект1, который создается function1() в file1.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)

}

Общая структура 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)


Как мне определить область действия object1 за пределами function1()?Я пытался использовать getter и setter в R для достижения этой цели, но я получаю ошибку node stack overflow.Я полагаю, эта ошибка возникает потому, что я source("file2.R") до function1() в file1.R и source("file1.R") в file2.R.Без этого я получаю ошибку object1 not found, как только R читает source("file2.R").

1 Ответ

1 голос
/ 07 июля 2019

Проблема не имеет ничего общего с областью действия 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")

Ошибка: переполнение стека узлов

Теперь удалите строку source("function1.R") из второго файла, function2.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.

...