Как сделать статическую переменную динамической?

#r #dynamic

#r #динамическая

Вопрос:

Предположим, что простой код:

 > sample(2,5,replace=TRUE)
[1] 2 1 1 1 2
  

При повторном вызове она может принимать другие переменные:

  > sample(2,5,replace=TRUE)
    [1] 1 2 2 1 2
  

Однако при присвоении переменной она придерживается одного предопределенного набора:

 > n <- (sample(2,5,replace=TRUE))
> n
[1] 1 1 2 1 1
> n
[1] 1 1 2 1 1
> n
[1] 1 1 2 1 1
  

Как мы можем заставить переменную n изменить свои значения?

Комментарии:

1. Привет, добро пожаловать в SO. Это крайне не рекомендуется. В будущем ваш код станет очень сложным для чтения и отладки как для вас, так и для людей, которые будут читать код. Просто определите функцию, чтобы вы могли вызвать ее снова.

2. Стерео правильно, и, как упоминали другие далее, идиоматический способ сделать это в R — написать для него функцию.

Ответ №1:

Я отвлекаюсь от некоторых вопросов о том, почему вы хотели бы это сделать, но вот один из способов, который несколько …. продвинутый:

 makeActiveBinding("n",function() sample(2,5,replace = TRUE),.GlobalEnv)
> n
[1] 2 2 1 2 1
> n
[1] 1 2 2 2 2
> n
[1] 2 1 1 1 1
  

Здесь происходит то, что n создается в глобальной среде, а затем связывается с функцией, так что всякий раз, когда требуется значение для n , она вызывает функцию.

Комментарии:

1. хорошее решение, но почему, о, почему некоторые хотят это сделать ?!

2. @Stereo Я согласен, моим ответом по умолчанию было бы просто написать функцию, как это сделал DMC. Я просто подумал, что было бы интересно продемонстрировать что-то более экзотическое.

Ответ №2:

Создание функции было бы идиоматическим подходом R.:

 samp <- function() sample(2, 5, replace = TRUE)

samp()
[1] 2 1 2 2 2
samp()
[1] 1 2 2 1 1
  

Комментарии:

1. Спасибо за ответ! — тоже отличная идея, но я специально искал создание нефункциональной переменной, которая имела бы те же свойства, что и функция здесь

Ответ №3:

… или просто вызовите sample() несколько раз…

 > n <- sample(2,5, replace=TRUE)
> n
[1] 1 2 2 1 2
> n <- sample(2,5, replace=TRUE)
> n
[1] 2 2 2 1 1