-
Couldn't load subscription status.
- Fork 277
user>rmr>Keyval types and combinations
First a table to categorize keyval pairs. Keys and values fall in three categories: NULL, not-NULL but 0-length ("length" in the rmr sense, that is nrow for matrices and data frames, length otherwise) and the "normal case" (not-NULL, length greater than 0).
| key/val | NULL | 0-length such as integer(0) | length > 0 |
| NULL | keyval(NULL, NULL) | keyval(NULL, NULL) | NULL keys |
| 0-length such as integer(0) | keyval(NULL, NULL) | keyval(NULL, NULL) | NO |
| length > 0 | NO | NO | normal case |
The idea is that keys and values need to be the same length or rmr2 will try to use recycling to achieve that, and recycling fails on zero-length arguments. The only exception is NULL keys with non-zero length values, which means "keys omitted". Typical use is map only jobs, or input to the map function. When paired with NULL or 0-length values, that creates an empty keyval pair, otherwise a keyval pair with values but NULL keys. When the keys are not-NULL 0-length, values must be too and the two form an empty keyval pair. When the keys are non-zero length, the values should as well. So we have three categories of keyval pairs, 0-length (or empty), NULL keys and non-zero-length values (NULL keys hereafter), and non-zero-length everything (normal case hereafter). Can we mix and match them as argument to c.keyval and as return values from map and reduce? This is answered in the following table.
| c.keyval | 0-length | NULL keys | normal case |
| 0-length | 0-length | NULL keys | normal case |
| NULL keys | NULL keys | NO | |
| normal case | normal case |
It is symmetric and can be summarized as follow:
- 0-length is the neutral element and can be combined with every other type
- each type can be combined with the same type (diagonal)
- NULL keys can not be combined with the normal case.