``````############################################################################.
# Intro to Modifying lists - a word of caution ...
############################################################################.
# Replacing, removing and adding items to a list all can be done
# with assignment statements. When using assignment statements to
# modify lists, you must pay careful attention to what is on the
# the left hand side (LHS) of the = sign in the assignment
# statement and what is on the right hand side (RHS) of the = sign.
#
# The LHS of the assignment always contains a list. However, the list
# on the LHS might use [single-brackets] or [[double-brackets]].
# It's very important to pay attention to the difference as they
# have different effects.
#
# The value on the RHS might be another list or a vector. Again, it's
# very important to pay attention to the mode of the data on the RHS.
# The result will be very different if the RHS contains a list vs if the
# RHS contains a vector.
#
# It's easier to understand all this when you see examples.
# I think it's easier to understand when you use [[double-brackets]]
############################################################################.``````

## 24.1 Removing objects from a list with NULL

``````#---------------------------------------------------------------.
# Removing objects from a list with NULL
#---------------------------------------------------------------.
# NULL is a "special value" that can be understood as "nothing".
# To remove an item from a list, you can assign NULL to that value.
#
# We'll discuss this in more depth below. For now, let's just see an example:
#---------------------------------------------------------------.

# let's recreate all of the data
rm(list= ls())

c(70,80,90),
c(75,85,88),
c(TRUE, FALSE,FALSE))``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.
# You can use [single-brackets]
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.

str(gradebook)  # the 3rd value is removed``````
``````List of 3
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1]  TRUE FALSE FALSE``````
``````#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.
# You can also use [[double-brackets]]
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.
gradebook[[2]] = NULL    # removes the 2nd item from the list
str(gradebook)  # the 2nd value is removed``````
``````List of 2
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1]  TRUE FALSE FALSE``````

### You cannot use NULL to remove values from vectors.

``````#------------------------------------------------------------------.
# VECTORS and LISTS are fundamentally different in how they
# work "under the covers". As a result, you
# cannot use NULL to remove values from vectors.
#------------------------------------------------------------------.
nums = c(100,200,300,400)
nums``````
``[1] 100 200 300 400``
``nums[3] = NULL   # This doesn't work``
``Error in nums[3] = NULL: replacement has length zero``
``nums  # nothing happened to nums``
``[1] 100 200 300 400``

### Removing more than one item in one command with [single-brackets]

``````rm(list=ls()) # Let's start from scratch
c(70,80,90),
c(75,85,88),
c(TRUE, FALSE,FALSE))
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``````# To remove more than one item from the list at once, use [single-brackets]
# and use more than one value in the index.
``````List of 2
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] 75 85 88

[[2]]
[1]  TRUE FALSE FALSE``````
``````# You cannot use [[double-brackets]] for this ...
# That makes sense since this would actually try to use recursive
# indexing to set the 2nd value in the 1st vector to NULL. However,
# you cannot set values in vectors to NULL.
#
``Error in gradebook[[c(1, 2)]] = NULL: replacement has length zero``
``str(gradebook)  ``
``````List of 2
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] 75 85 88

[[2]]
[1]  TRUE FALSE FALSE``````

## 24.2 Adding items to a list - 3 different ways

``````##############################################################################.
# There are 3 different way to add items to a list
#
# option 1 - Use the c() function.
#
# option 2 - Use the append() function.
#
# option 3 - Assign new items to positions past the end of the list.
#            Pay careful attention to using [single-brackets] vs [[double-brackets]]
#
# See the examples below ...
##############################################################################.``````

### add to a list - option 1 - use the c() function

``````rm(list=ls()) # start from scratch
c(70,80,90),
c(75,85,88),
c(TRUE, FALSE,FALSE))``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````#######################################################################.
# Adding to a list - option #1 - use the c() function
#---------------------------------------------------------------------.
# The c() function can be used to combines lists in the same way it
# can be used to combine vectors.
#    c(list1, list2, list3)   # a new combined list of all the items
# See the example.
#######################################################################.

# Create a LIST that contains the new data
newData = list(c(61, 62, 63, 64),     # another test
c("senior", "sophomore", "senior", "freshman") # year in school
)

# combine the lists with the c function
str(combinedList)``````
``````List of 6
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE
\$ : num [1:4] 61 62 63 64
\$ : chr [1:4] "senior" "sophomore" "senior" "freshman"``````
``combinedList # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE

[[5]]
[1] 61 62 63 64

[[6]]
[1] "senior"    "sophomore" "senior"    "freshman" ``````

### add to a list - option 2 - use the append() function

``````rm(list=ls()) # start from scratch
c(70,80,90),
c(75,85,88),
c(TRUE, FALSE,FALSE))``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````#######################################################################.
# Adding to a list - option #2 - use the append() function
#
# Append the values in a one list onto the end of another list.
# see examples below
#######################################################################.

# Create a LIST that contains the new data
newData = list(c(61, 62, 63, 64),     # another test
c("senior", "sophomore", "senior", "freshman") # year in school
)

# combine the lists with the append function
str(combinedList)``````
``````List of 6
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE
\$ : num [1:4] 61 62 63 64
\$ : chr [1:4] "senior" "sophomore" "senior" "freshman"``````
``````# NOTE - the append function works with vectors too.
# It can be used in other ways as well.
# ?append  ``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``

### add to a list - option 3 - assign new items to positions past the end of the list

``````rm(list=ls()) # start from scratch
c(70,80,90),
c(75,85,88),
c(TRUE, FALSE,FALSE))``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````# If you add an item using [[double-brackets]]
# Whatever is on the RHS will be placed in the one position
# identified on the LHS.

``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE

[[5]]
[1] "senior" "senior" "junior"``````
``````# If you add an item using [single-brackets] the values in the list (or vector)
# on the RHS will be assigned to the corresponding positions on the LHS.
#
# The following has a list of two values on the RHS.
# The 1st vector in the list on the RHS is assigned to position 6
# The 2nd vector in the list on the RHS is assigned to position 7

gradebook[c(6,7)] = list(c("B.", "David", "Loyd"),            # middle names
c("Berger", "Chaplan", "Wright")     # last names
)
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE

[[5]]
[1] "senior" "senior" "junior"

[[6]]
[1] "B."    "David" "Loyd"

[[7]]
[1] "Berger"  "Chaplan" "Wright" ``````

#### You can reorganize items in the list after you add the new items.

``````# We added middle and last names to the end of the list.
# However, it would be nice if they were at the beginning of the list.
# We can reorganize the list.
# This is the way the list looks as of now. Notice that the middle
# and last names are in the 6th and 7th positions in the list.
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE

[[5]]
[1] "senior" "senior" "junior"

[[6]]
[1] "B."    "David" "Loyd"

[[7]]
[1] "Berger"  "Chaplan" "Wright" ``````
``````# Let's rearrange the list so the first,middle and last names are
# all at the beginning of the list.

# Here is the new list
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] "B."    "David" "Loyd"

[[3]]
[1] "Berger"  "Chaplan" "Wright"

[[4]]
[1] 70 80 90

[[5]]
[1] 75 85 88

[[6]]
[1]  TRUE FALSE FALSE

[[7]]
[1] "senior" "senior" "junior"``````

#### Skipped entries in a list contain NULL

``````# If you skip entires in a list then the missing entries are NULL.
# You probably wouldn't want to do that. However, it's good
# to understand what's happening if you do do it.

rm(list=ls()) # start from scratch
c(70,80,90),
c(75,85,88),
c(TRUE, FALSE,FALSE))``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````# Assign a new value to position 7

# Positions 5 and 6 will "implicitly" contain NULL
# (i.e. we didn't actually assign NULL)
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE

[[5]]
NULL

[[6]]
NULL

[[7]]
[1] "some"   "new"    "values"``````
``````# If we want to remove those positions we can
# EXPLICITLY assign NULL to those positions.
# (Sounds strange, but this will actually work.)

``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE

[[5]]
[1] "some"   "new"    "values"``````

### You can add items to an empty list (this will be a useful technique later)

``````#############################################################################.
# Add items to an empty list (this will be a useful technique later)
#############################################################################.
stuff = list()    # this creates an empty list
stuff``````
``list()``
``str(stuff)``
`` list()``
``````# add a value to the 1st position
stuff[[1]] = c("apple", "pear", "banana")

# add a value to the 2nd position
stuff[[2]] = c("red", "green", "yellow")

# add values to the 3rd and 4th positions using [single-brackets]
stuff[c(3,4)] = list( c(1.99, 2.99, 3.99),    # price
c(TRUE, FALSE, TRUE))   # on sale

# Here is the new data
str(stuff)``````
``````List of 4
\$ : chr [1:3] "apple" "pear" "banana"
\$ : chr [1:3] "red" "green" "yellow"
\$ : num [1:3] 1.99 2.99 3.99
\$ : logi [1:3] TRUE FALSE TRUE``````
``````# You can also add an entire list
# (gradebook was defined above - this should probably be a better example)
str(stuff)``````
``````List of 5
\$ : chr [1:3] "apple" "pear" "banana"
\$ : chr [1:3] "red" "green" "yellow"
\$ : num [1:3] 1.99 2.99 3.99
\$ : logi [1:3] TRUE FALSE TRUE
\$ :List of 5
..\$ : chr [1:3] "bob" "charlie" "frank"
..\$ : num [1:3] 70 80 90
..\$ : num [1:3] 75 85 88
..\$ : logi [1:3] TRUE FALSE FALSE
..\$ : chr [1:3] "some" "new" "values"``````
``str(gradebook)  # see the structure``
``````List of 5
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE
\$ : chr [1:3] "some" "new" "values"``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE

[[5]]
[1] "some"   "new"    "values"``````
``# View(gradebooks)  # see the structure - try this command yourself``

## 24.3 Replacing items in a list

### Using [[double-brackets]] to replace entries in a list

``````#####################################################################.
# Using [[double-brackets]] to replace entries in a list
#
#    SOME_LIST[[ 1 ]] = SOME_VALUE
#
# The value at the specified position is replaced with SOME_VALUE
#####################################################################.
rm(list=ls())  # start from scratch
gradebook = list( c("bob", "charlie", "frank"), # student names
c(70,80,90),                  # grades from first test
c(75,85,88),                  # grades from second test
c(TRUE, FALSE,FALSE))         # TRUE for honors students``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````#---------------------------------------------------------------------------.
# Remember that SOME_LIST[[double-brackets]] will identify EXACTLY ONE item.
#
# If you use [[double-brackets]] on the LHS of the = sign then whatever
# is on the RHS of the = sign will replace the one item that is
# identified on the LHS of the = sign.
#---------------------------------------------------------------------------.

# EXAMPLE:
# Replace the 1st item in the list with new vector of names

``````[[1]]
[1] "anne"  "betty" "carla"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````

### — Practice —

``````#########################################################################.
# QUESTION - write code to replace the 2nd item in the list with a new
#########################################################################.

``````[[1]]
[1] "anne"  "betty" "carla"

[[2]]
[1] 71 81 91

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````

### Another example - insert a list into a list

``````rm(list=ls())  # start from scratch
gradebook = list( c("bob", "charlie", "frank"), # student names
c(70,80,90),                  # grades from first test
c(75,85,88),                  # grades from second test
c(TRUE, FALSE,FALSE))         # TRUE for honors students``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````# If the item on the RHS of the = sign is itself a list, that will be
# inserted as a nested list.
#
# The following example inserts a nested list.

gradebook[[1]] = list( c("Robert",     "Charles", "Francois"),
c("M.",         "David",   ""),
c("Rabinowitz", "Bush",    "McDonald")
)

# It's easier to see the new structure of the list by using str
``````List of 4
\$ :List of 3
..\$ : chr [1:3] "Robert" "Charles" "Francois"
..\$ : chr [1:3] "M." "David" ""
..\$ : chr [1:3] "Rabinowitz" "Bush" "McDonald"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[[1]][[1]]
[1] "Robert"   "Charles"  "Francois"

[[1]][[2]]
[1] "M."    "David" ""

[[1]][[3]]
[1] "Rabinowitz" "Bush"       "McDonald"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````

### Using RECURSIVE INDEXING to replace a single value deep inside of a list

``````############################################################################.
# Using RECURSIVE INDEXING to replace a single value deep inside of a list
############################################################################.

# Let's start again with the following data.

rm(list=ls())  # start from scratch
gradebook = list( c("bob", "charlie", "frank"), # student names
c(70,80,90),                  # grades from first test
c(75,85,88),                  # grades from second test
c(TRUE, FALSE,FALSE))         # TRUE for honors students``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````#-------------------------------------------------------------------------.
# The following example uses
# "recursive indexing" (i.e. 2 or more values in the [[double-brackets]])
# to pinpoint the name "charlie" in the 1st entry of the list.
# Therefore the name "charles" replaces that single item.
#-------------------------------------------------------------------------.

gradebook[[c(1,2)]] = "charles"   # Change "charlie" to "charles"
``````List of 4
\$ : chr [1:3] "bob" "charles" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charles" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````

### — Practice —

``````########################################################################.
# QUESTION - write code to
# add 5 points to the 2nd students grade in the 3rd vector
########################################################################.``````
``````# ANSWER
gradebook # These are the original values``````
``````[[1]]
[1] "bob"     "charles" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``````gradebook[[c(3, 2)]] = gradebook[[c(3, 2)]] + 5  # ANSWER

gradebook  # These are the new values``````
``````[[1]]
[1] "bob"     "charles" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 90 88

[[4]]
[1]  TRUE FALSE FALSE``````

### Using [single-brackets] to replace items in a list

``````############################################################################.
# Using [single-brackets] to replace items in a list
############################################################################.
# When you use [single-brackets] on the left hand side (LHS) of the = sign,
# you can potentially identify more than one value from the list.
# Therefore the values from the RHS of the = sign may also contain more than
# one value. The values are replaced one by one from the values on the RHS to
# the positions in the list on the LHS.
# This is true both in the case that the RHS contains a list
# and in the case that the RHS contains a vector.
# Therefore it's very important to be aware of the type of data (list or vector)
# that is on the RHS of the = sign.
#
############################################################################.``````

#### list1[single-brackets]=list2 #replace values in list1 with values from list2

``````# Let's start again with new data

rm(list=ls())  # start from scratch
gradebook = list( c("bob", "charlie", "frank"), # student names
c(70,80,90),                  # grades from first test
c(75,85,88),                  # grades from second test
c(TRUE, FALSE,FALSE))         # TRUE for honors students``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````# EXAMPLE:
#
# Replace the 2nd and 3rd items in the list on the left with the items
# in the list on the right.
#
# IMPORTANT - Notice that the item on the right is also a LIST.
c(91,92,93))

str(gradebook)  # str of the new list``````
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 81 82 83
\$ : num [1:3] 91 92 93
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 81 82 83

[[3]]
[1] 91 92 93

[[4]]
[1]  TRUE FALSE FALSE``````
``````#-----------------------------------------------------------.
# ANOTHER EXAMPLE - Replace the names with new names.
#-----------------------------------------------------------.
# It makes no difference what is in the list on the RHS,
# just that it is a list with the correct number of values.
#
# Replace the 1st entry in the list with new names.
# Notice that the RHS of the = sign is a LIST
#-----------------------------------------------------------.

str(gradebook)  # str of the new list``````
``````List of 4
\$ : chr [1:3] "sue" "joan" "eve"
\$ : num [1:3] 81 82 83
\$ : num [1:3] 91 92 93
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "sue"  "joan" "eve"

[[2]]
[1] 81 82 83

[[3]]
[1] 91 92 93

[[4]]
[1]  TRUE FALSE FALSE``````
``````# You can even replace the names with any other type of info.
str(gradebook)  # str of the new list``````
``````List of 4
\$ : chr [1:7] "sue" "joan" "eve" "fran" ...
\$ : num [1:3] 81 82 83
\$ : num [1:3] 91 92 93
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "sue"    "joan"   "eve"    "fran"   "goldie" "laura"  "mindy"

[[2]]
[1] 81 82 83

[[3]]
[1] 91 92 93

[[4]]
[1]  TRUE FALSE FALSE``````

#### SOME_LIST[single-brackets] = SOME_VECTOR # uses values from the vector

``````#---------------------------------------------------------------------,
# SOME_LIST[single-brackets] = SOME_VECTOR
#---------------------------------------------------------------------,
# CAREFUL - if you have a VECTOR on the RHS then
# the values from the VECTOR on the RHS will replace
# the associated values from the LIST on the LHS.
#
# Generally speaking you probably don't want to to that.
# However, you should be aware of what happens if you try to do that.
#
# Let's start again with the following data
#---------------------------------------------------------------------,

rm(list=ls())  # start from scratch
gradebook = list( c("bob", "charlie", "frank"), # student names
c(70,80,90),                  # grades from first test
c(75,85,88),                  # grades from second test
c(TRUE, FALSE,FALSE))         # TRUE for honors students``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````#-------------------------------------------------------------------------.
# EXAMPLE:
#
# The following has only one value on the LHS but 3 values on the RHS.
# (Keep in mind - the LHS is a list but the RHS is a vector).
#
# This will cause only the first value from the RHS to be assigned to the
# single value on the LHS.
# i.e. the entire names vector (i.e. the 1st value on the LHS)
# is replaced with just "sue" (i.e. the 1st value on the RHS)
#
# In addition you get a WARNING since there are more values on the RHS than
# there should be.
#-------------------------------------------------------------------------.

``````Warning in gradebook[1] = c("sue", "joan", "anne"): number of items to replace
is not a multiple of replacement length``````
``str(gradebook)``
``````List of 4
\$ : chr "sue"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "sue"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``````# The correct way to do this is to make the value on the RHS into a list.
gradebook[1] = list ( c("sue", "joan", "anne")  )
``````List of 4
\$ : chr [1:3] "sue" "joan" "anne"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "sue"  "joan" "anne"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``````# Or another correct way to do this is to use [[double-brackets]] on the LHS
# and the vector on the RHS
gradebook[[1]] = c("leticia jones", "paulette cohen", "henrietta burns")
``````List of 4
\$ : chr [1:3] "leticia jones" "paulette cohen" "henrietta burns"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "leticia jones"   "paulette cohen"  "henrietta burns"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````

### list1[1:4] = listWith2Values # recycling rule!!

``````#--------------------------------------------------------------------------.
# DON'T FORGET the recycling rule!!!
#--------------------------------------------------------------------------.

# Let's start again with the following data

rm(list=ls())  # start from scratch
gradebook = list( c("bob", "charlie", "frank"), # student names
c(70,80,90),                  # grades from first test
c(75,85,88),                  # grades from second test
c(TRUE, FALSE,FALSE))         # TRUE for honors students``````
``str(gradebook)  # see the structure``
``````List of 4
\$ : chr [1:3] "bob" "charlie" "frank"
\$ : num [1:3] 70 80 90
\$ : num [1:3] 75 85 88
\$ : logi [1:3] TRUE FALSE FALSE``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "bob"     "charlie" "frank"

[[2]]
[1] 70 80 90

[[3]]
[1] 75 85 88

[[4]]
[1]  TRUE FALSE FALSE``````
``# View(gradebooks)  # see the structure - try this command yourself``
``````#------------------------------------------------------------------------------.
# Replace entries 1,2,3,4 in gradebook with the entries in the list on the RHS.
# However there are only two entries in the list on the RHS. Therefore
# The entries on the RHS are recycled so that there are four entries
# in the list on the RHS.
#------------------------------------------------------------------------------.

c(1.99, 2.99, 3.99, 4.99, 5.99))

str(gradebook) # notice the vectors were recycled``````
``````List of 4
\$ : chr [1:5] "apple" "banana" "comquat" "pear" ...
\$ : num [1:5] 1.99 2.99 3.99 4.99 5.99
\$ : chr [1:5] "apple" "banana" "comquat" "pear" ...
\$ : num [1:5] 1.99 2.99 3.99 4.99 5.99``````
``gradebook # (see the actual values)``
``````[[1]]
[1] "apple"   "banana"  "comquat" "pear"    "peach"

[[2]]
[1] 1.99 2.99 3.99 4.99 5.99

[[3]]
[1] "apple"   "banana"  "comquat" "pear"    "peach"

[[4]]
[1] 1.99 2.99 3.99 4.99 5.99``````