15 Vectors

library(tidyverse) 

15.1 一个很长的导图

15.2 导图补充

15.2.1 全局字符串池

R使用的是全局字符串池。这意味着每个唯一的字符串在内存中只保存一次,每次对这个字符串的使用都指向这段内存,这样可以减少复制字符串所需的内存空间。

15.2.2 一些数值型特殊值的检查

x <- c(1,NA,NaN,Inf,-Inf)
is.finite(x)
#> [1]  TRUE FALSE FALSE FALSE FALSE
is.infinite(x)
#> [1] FALSE FALSE FALSE  TRUE  TRUE
is.na(x)  # 这个NA NaN都会返回True
#> [1] FALSE  TRUE  TRUE FALSE FALSE
is.nan(x)
#> [1] FALSE FALSE  TRUE FALSE FALSE

15.3 练习

(1)对比setNames()purrr::set_names()

用法上的略有不同暂不说,purrr::set_names()的主要特色在于

  • 允许使用函数或者公式来转换现有名称:
purrr::set_names(c(a = 1, b = 2, c = 3), toupper)
#> A B C 
#> 1 2 3
purrr::set_names(c(a = 1, b = 2, c = 3), ~toupper(.))
#> A B C 
#> 1 2 3
  • purrr::set_names()要求命名向量与原向量长度相同,setNames()则不然:
purrr::set_names(1:4, c("a", "b"))
#> Error: `nm` must be `NULL` or a character vector the same length as `x`
setNames(1:4, c("a", "b"))
#>    a    b <NA> <NA> 
#>    1    2    3    4

(2)在编写程序/函数时,需要考虑一些特殊值或者特殊情况,比如空向量、Inf-InfNANaN等的处理。

(3)What happens if you subset a tibble as if you’re subsetting a list? What are the key differences between a list and a tibble?

tibble可以看作是列的列表,只不过每列的长度必须相同,这是与列表最大的不同。在取子集上两者也很类似:

x <- tibble(a=c(1,2),b=c("a","c"))
x["a"]
#> # A tibble: 2 x 1
#>       a
#>   <dbl>
#> 1     1
#> 2     2
x[["a"]]
#> [1] 1 2

(4)使用list作为tibble的列也是可行的(如果它们的长度相同)!

tibble(x = 1:3, y = list("a", 1, list(1:3)))
#> # A tibble: 3 x 2
#>       x y         
#>   <int> <list>    
#> 1     1 <chr [1]> 
#> 2     2 <dbl [1]> 
#> 3     3 <list [1]>