Мне нужно передать некоторые данные в R
из NetLogo
, используя R-extension
, выполнить некоторые вычисления и затем назначить вывод R
определенным патчам.
Я перепробовал каждую комбинацию map
и foreach
в NetLogo
, которую только могу себе представить. Я пытался изменить цвета на основе идентификатора патча, потому что он виден. Установка всех патчей синего цвета работает.
observer> foreach [1 2 3] [ x -> ask patches with [id = x] [ set pcolor blue ] ]
Когда я добавляю второй список, все, что я пробовал, работает. Я также попытался присвоить значения патчам безрезультатно. Получились пятна 4, 5 и 6 красных ...
observer> foreach [4 5 6] [ x -> ask patches with [id = x] [ set pcolor [blue red green] ]]
Следующий подход не сработал.
observer> set list-a (list blue red green)
observer> set list-b (list 7 8 9)
observer> ask patches with [id = list-b] [ set pcolor list-a]
Попытка foreach с двумя списками, подобными этим:
observer> foreach list-b list-b ask patches with [id = list-b] [set pcolor list-a]
observer> show map list-b list-b ask patches with [id = list-b] [set pcolor list-a]
переопределение list-a и повторная попытка первоначального подхода устанавливают эти патчи синим.
observer> set list-a r:get "df1[[1]]"
observer> show list-a
observer: [1 5 8]
observer> foreach list-a [ x -> ask patches with [id = x] [ set pcolor blue ] ]
Если бы я мог просто понять, как работать с двумя списками, я был бы установлен.
например
list-a [1 2 3]
list-b [blue green red]
; effectively do the following
ask patch with [id = 1] [set pcolor blue]
ask patch with [id = 2] [set pcolor green]
ask patch with [id = 3] [set pcolor red]
На самом деле проблема в том, что у меня есть переменные активности (все патчи ниже прививают кукурузу).
> a
id a_corn a_crp a_soy
1 1 0 1 0
2 2 0 1 0
3 3 0 1 0
4 4 0 1 0
5 5 0 1 0
6 6 0 1 0
7 7 0 1 0
8 8 0 1 0
9 9 0 1 0
10 10 0 1 0
>
Я знаю, что с расширениями r данные приходят в netlogo как неназванные вложенные списки. Так что, если я избегу вложения:
set list-id r:get "a$id"
set list-a r:get "a$a_corn"
; then netlogo iterates through the lists:
ask patch with [id = 1] [set a_corn 0]
ask patch with [id = 2] [set a_corn 0]
; and so on
Я открыт для предложений о лучших путях. Но идентификаторы должны совпадать, могут не быть последовательными, а приведенный выше кадр данных будет различаться по размеру и содержанию.
UPDATE:
Продолжая работать над проблемой, я документирую здесь шаги, чтобы найти их позже.
Я нашел анонимные команды.
observer> set procedure [[x y] -> ask patches with [id = x] [set pcolor y]]
observer> show is-anonymous-command? procedure
observer: true
observer> set list-a (list blue red green)
observer> set list-b (list 7 8 9)
observer> (foreach list-b list-a procedure) ; does nothing
Я все очистил, настроил заново и сработало следующее:
observer> ask patches with [id = 7] [set pcolor red]
observer> set procedure [[x y] -> ask patches with [id = x] [set pcolor y]]
observer> set list-b (list 7 8 9)
observer> set list-a (list blue red green)
observer> (foreach list-b list-a procedure)
Теперь о прикладной части проблемы:
observer> set procedure [[x y] -> ask patches with [id = x] [set a_corn y]]
observer> set list-a (list 1 1 1)
observer> (foreach list-b list-a procedure)
и все работает!