Повторное использование нескольких объектов, созданных в функции - PullRequest
0 голосов
/ 13 мая 2019

Я хочу использовать несколько объектов, созданных внутри функции, с другой функцией:

test1 <- function(x){
  y <- x + 1
  z <- x * 2
}

test2 <- function(...){
  test1(x)
  print(u <- y * z)
}

x <- 2

test2(test1)

Выдает ошибку Error in print(u <- y * z) : object 'y' not found.

Как я могу повторно использовать все объекты, назначенные в функции без с использованием глобального назначения <<-?

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Я бы использовал простой return() с list() или c():

test1 <- function(x){
  y <- x + 1
  z <- x * 2 # if you don't use return these two won't leave test1

  return(list(y=y, z=z)) # equivalent without return() is list(y=y, z=z)
#or: list(y=y, z=z)
}

test2 <- function(...){
  ret1 <- test1(x)
  print(ret1$y * ret1$z)
 #or: return(ret1$y * ret1$z)
}

Обратите внимание, что использование return() не обязательно, так как последний объект не назначен вфункция возвращается автоматически.

Использование return() может помочь с удобочитаемостью.

Прочитать о return().

0 голосов
/ 13 мая 2019

Ваша проблема связана с присваиванием переменных: вы используете «простое» присваивание с символом <-. Это означает, что переменная назначается в ее блоке, например, y определяется в test1(). Это означает, что вы не можете использовать его снаружи, потому что оно не определено за пределами test1(). Чтобы выполнить это, попробуйте символ назначения <<-, который назначает переменную в верхнем окружении и, таким образом, позволяет повторно использовать ее за пределами блока, в котором она определена.

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