Abhishek Bhatia
Abhishek Bhatia

Reputation: 9816

Applying Operations on each element of the list

I wish to divide each element in a list by a number, I have tried the following:

Approach 1:

set item 0 (new-vec item 0 vec / number)
set item 1 (new-vec item 1 vec / number)

gives error this isn't something you can use set on

Approach 2:

 foreach new-vec
[ set ? ? / number]

doesn't seem to work.

Please help. Thanks in advance.

Upvotes: 3

Views: 1713

Answers (2)

Stan Rhodes
Stan Rhodes

Reputation: 420

This is how to do it in NetLogo 6, which changed anonymous procedures and thus how this is done in map:

let new-vec [10 50 100]
let number 10
let divided-vec map [ i -> i / number ] new-vec

Upvotes: 1

Nicolas Payette
Nicolas Payette

Reputation: 14972

This is because NetLogo lists are immutable data structures.

If you really want mutability you can always use the array extension, but once you've learned to use NetLogo's immutable lists properly, this is almost never necessary: the lists primitives are usually all that you need.

To divide all the numbers in a list by some other number, use map:

let new-vec [10 50 100]
let number 10
let divided-vec map [ ? / number ] new-vec

will assign the list [1 5 10] to divided-vec.

The map operation builds a new list by applying an operation to each element of the list you pass to it. In the example above, I assigned the new list to a new variable (divided-vec), but if you wanted, you could also assign it back to new-vec:

set new-vec map [ ? / number ] new-vec

This will behave as if you modified new-vec in place, though it won't be the case.

If you want to apply an operation to just one item in a list, you can do it with a combination of replace-item and item:

let my-list [2 4 6 8 10]
show replace-item 1 my-list (item 1 my-list  * 100)

will show: [2 400 6 8 10]

Upvotes: 4

Related Questions