перебрать два списка в NetLogo: большой контекст изображения: расширение R. Присвойте значения патчей конкретным патчам из R - PullRequest
0 голосов
/ 11 июля 2019

Мне нужно передать некоторые данные в 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)

и все работает!

...