#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