# Assigning to arrays

## Indexed Assignment

Assign values at specified indices.

      t←4 4⍴'some sample text'
t[⍸t∊'aeiou']←'!'

## Selective Assignment

Define n←5 5⍴⍳25 in your workspace.

1. Using selections, find at least four different ways to set the bottom-right 3 by 3 submatrix in n to 0. For example, (2 2↓n)←0.

Hint

See which primitives may be used in a selective assignment

## Modified Assignment

Experiment with the following expressions, paying particular attention to the name f← array construct.

      salaries←18250 42500 56000 57250 48640
codes←'ACDDC'
salaries×←1.1
salaries[⍸codes='C']×←1.05

a←⎕A
(3↑a),←'abc'
(¯4↑a),←'xyz'  ⍝ this one will error — think about why!

## At

Monadic functions take a single right argument array as input. Dyadic functions take two argument arrays.

Monadic operators take a single left operand which can be a function or an array (as in +/ where plus + is the function operand and reduce / is the operator).

Dyadic operators take two operands which could be functions or arrays depending on the operator's definition. For example, the rank operator F⍤k takes a function left operand F and array right operand k of up to 3 elements.

Selective and indexed assignment methods will change the values of variables. The "at" operator @ merges two arrays at specified indices and returns a new array.

If a function right operand returns a boolean array when applied to ⍵ (e.g. 3=1 3 5) then ones 1 in the boolean array determine where scalars of ⍺ are inserted.

      ('∆⍥'@{⍵∊'AEIOU'})2 3⍴'DYALOG'
(' '@2 3 4)'DYALOG'
(' '@(1 2)(1 3)(2 1))2 3⍴'DYALOG'
1. The following expression contains an error:
('∆⍥'@1)2 3⍴'DYALOG'
Change the parenthesised function containing @ in two ways so that it gives the following results:
1. ∆∆∆
LOG

2. ∆∆∆
⍥⍥⍥

Generally, the left operand to @ is a function applied to scalars in ⍵ which are specified by a right operand that is either an array of scalar (simple or enclosed vector) indices or a boolean array returned by a right operand function. An array left operand is shorthand for a constant function that returns the array.

      {1↓(1∘(819⌶)@{¯1⌽' '=⍵})' ',⍵}'my excellent heading'

## Strand Assignment

Distributed assignment or strand assignment allows multiple names to be defined using a single assignment arrow ←.

      (max min avg)←{(⌈⌿⍵)(⌊⌿⍵)((+⌿÷≢)⍵)}3 1 4 1 5

Note

Strand assignment does not require names to be parenthesised, but we strongly recommend it for clarity.

We can assign items in nest to the three variables s←'A' v←1 2 3 and m←3 3⍴⍳9 using a single assignment arrow.

      nest←('A'(1 2 3))(3 3⍴⍳9)
((s v) m)←nest

Warning

You might have some issues when using inline, modified or strand assignment in dfns. This is by design, but can be a source of confusion.

      {a←3 ⋄ f←+ ⋄ a f←3 ⋄ a}⍬
3
a←3 ⋄ f←+ ⋄ a f←3 ⋄ a
6

You can get around these problems by writing ∘⊢ (or in 12.1: ∘{⍵} ) to the immediate right of any function involved:

      {a←3 ⋄ f←+ ⋄ a f∘{⍵}←3 ⋄ a}⍬
6