сделать созданную переменную доступной в родительской среде в r - PullRequest
0 голосов
/ 14 сентября 2018

Я использую функцию внутри функции в R для создания новых переменных. Мне нужно иметь возможность использовать эти переменные в родительской среде, НО не глобально.

Например, одним из решений является использование оператора глобального присваивания <<-:

f1 <- function(x){

  cat("X is ", x, "\n")
  f2 <- function(){
    cat("X will now be transfromed\n")
    y <<- x + 4 # Use Global assignment
  }

  f2()

  cat("Y is ", y, "\n")
} 
f1(x = 5)

Но у меня более 20 переменных, так что это загромождает мое рабочее пространство и является плохой практикой.

Мне было интересно, есть ли лучшее решение без необходимости играть с такими понятиями, как vars_to_parent <- new.env().

Есть ли какое-то изящное волшебство R, где у вас есть новый оператор присваивания, может быть, что-то глупое, например:

`<p-` <- function(){assign variable in such a way that its available in parent}

Что может помочь вам получить эти вновь созданные переменные в родительскую среду:

f1 <- function(x){

  cat("X is ", x, "\n")
  f2 <- function(){
    cat("X will now be transfromed\n")
    y <p- x + 4 # New cool assignment operator
  }

  f2()

  cat("Y is ", y, "\n")
} 
f1(x = 5)

1 Ответ

0 голосов
/ 14 сентября 2018

Последняя строка f скопирует все переменные в f в указанную среду. Альтернативно, замените as.list(environment()) на list("a", "b") или скопируйте только переменные, начинающиеся со строчной буквы, скажем, as.list(ls(pattern = "^[a-z]"))

if (exists("a")) rm(a)
if (exists("b")) rm(b)

f <- function(envir = parent.frame()) {
  a <- b <- 1
  invisible( list2env(as.list(environment()), envir) )
}
f()
a
## [1] 1
b
## [1] 1

Вместо того, чтобы вводить переменные непосредственно в родительский объект, еще одна возможность, которая немного чище, - это возвращение самой среды:

f2 <- function(envir = parent.frame()) {
  a <- b <- 1
  environment()
}
e <- f()
e$a
## [1] 1
e$b
## [1] 1

или вернуть список, заменив последний оператор в f2 на:

list2env(environment())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...