The Big R-Book. Philippe J. S. De Brouwer
Чтение книги онлайн.
Читать онлайн книгу The Big R-Book - Philippe J. S. De Brouwer страница 35
![The Big R-Book - Philippe J. S. De Brouwer The Big R-Book - Philippe J. S. De Brouwer](/cover_pre848614.jpg)
bigger than
smaller than
bigger or equal
equal
not equal
4.4.3 Logical Operators
Logical Operators combine vectors element by element. While logical operators can be applied directly on composite types, theymust be able to act on numeric, logical or complex types in order to produce understandable results.
operator – logical
v1 <- c(TRUE, TRUE, FALSE, FALSE) v2 <- c(TRUE, FALSE, FALSE, TRUE) v1 & v2 # and ## [1] TRUE FALSE FALSE FALSE v1 | v2 # or ## [1] TRUE TRUE FALSE TRUE !v1 # not ## [1] FALSE FALSE TRUE TRUE v1 && v2 # and applied to the first element ## [1] TRUE v1 || v2 # or applied to the first element ## [1] TRUE v1 <- c(TRUE,FALSE,TRUE,FALSE,8,6+3i,-2,, NA) class(v1) # v1 is a vector or complex numbers ## [1] “complex” v2 <- c(TRUE) as.logical(v1) # coerce to logical (only 0 is FALSE) ## [1] TRUE FALSE TRUE FALSE TRUE TRUE TRUE FALSE NA v1 & v2 ## [1] TRUE FALSE TRUE FALSE TRUE TRUE TRUE FALSE NA v1 | v2 ## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Note that numbers different from zero are considered as TRUE, but only zero is considered as FALSE. Further, NA is implemented in a smartway. For example, in order to assess TRUE & NA
we need to know what the second element is, hence it will yield NA. However, TRUE | NA
will be true regardless what the second element is, hence R will show the result.
FALSE | NA ## [1] NA TRUE | NA ## [1] TRUE FALSE & NA ## [1] FALSE TRUE & NA ## [1] NA FALSE | NA | TRUE | TRUE ## [1] TRUE TRUE & NA & FALSE ## [1] FALSE
4.4.4 Assignment Operators
R has multiple ways to express an assignment. While it is possible to mix and match, we prefer to choose just one and stick with it. We will use <-
.
operator – assignment
and
or
# left assignment x <- 3 x = 3 x<<- 3 # right assignment 3 -> x 3 ->> x #chained assignment x <- y <- 4
not
The <<-
or ->>
operators change a variable in the actual environment and the environment above the actual one. Environments will be discussed in Section 5.1 “Environments in R” on page 110. Till now we have always been working in the command prompt. This is the root-environment. A function will create a new (subordinated) environment and might for example use a new variable. When the function stops running that environment stops to exist and the variable exists no longer.3
assignment – left
assignment – right
assignment – chained
Generally it is best to keep it simple, most people will expect to see a left assignment, and while it might make code a little shorter, the right assignment will be a little confusing for most readers. Best is to stick to =
or <-
and of course <<-
whenever assignment in a higher environment is also intended.
In some special cases, such as the definition of parameters of a function, it is not possible to use the “arrow” and onemust revert to the =
sign. This makes sense, because that is not the same as a traditional assignment.
mean(v1, na.rm = TRUE) # works (v1 is defined in previous section) ## [1] 1.75+0.375i mean(v1, na.rm <- TRUE) # fails ## Error in mean.default(v1, na.rm <- TRUE): ‘trim’ must be numeric of length one
While the <<-
seems to do exactly the same, it changes also the value of the variable in the environment above the actual one. The following example makes clear how <-
only changes the value of x
while the function is active, but <<-
also changes the value of the variable x
in the environment where the function was called from.
# f # Assigns in the current and superior environment 10 to x, # then prints it, then makes it 0 only in the function environment # and prints it again. # arguments: # x -- numeric f <- function(x) {x <<- 10; print(x); x <- ; print(x)} x <- 3 x ## [1] 3 # Run the function f(): f(x) ## [1] 10 ## [1] 0 # Only the value assigned with <<- is available now: x ## [1] 10
Digression – For C++ programmers
If you are moving from C++, you will miss the speed and functionality of passing variable by their pointer. The <<-
operator will provide you the ability to change a variable in the environment above the function.
While it is certainly cool and most probably efficient to change a variable in the environment above the function, it will make your code harder to read and if the function is hidden in a package it might lead to unexpected side effects. This superpower is best used sparingly.
4.4.5