Vector hóa trong R về cơ bản có nghĩa là bất kỳ vòng lặp nào được chuyển sang ngôn ngữ được biên dịch nhanh hơn, chẳng hạn như C hoặc FORTRAN. Để điều đó xảy ra (các) vectơ trong câu hỏi phải là "nguyên tử" - tức là nó phải "phẳng" và đồng nhất - và loại vectơ, mà bạn có thể kiểm tra typeof()
, sẽ có ý nghĩa đối với (các) thao tác được thực hiện. Nếu nó là nguyên tử thì nó được vector hóa.
Bạn có thể kiểm tra nếu một vector là nguyên tử sử dụng is.atomic()
. Một loại vectơ khác không được vector hóa được gọi là "đệ quy", mà bạn có thể kiểm tra bằng cách sử dụng is.recursive()
. Các đối tượng đệ quy có thể chứa các đối tượng khác thuộc bất kỳ loại nào, tức là chúng có thể không đồng nhất. Danh sách và khung dữ liệu được đệ quy.
Hãy thử một cái gì đó như sau để hiểu rõ hơn về nguyên tử so với đệ quy:
# Atomic:
1
1:3
c("a", "b", "c")
c(T, F, T)
# Recursive:
list(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))
data.frame(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))
# Vectors can be atomic or recursive:
is.vector(1:9) # TRUE
is.atomic(1:9) # TRUE
is.recursive(1:9) # FALSE
is.vector(list(nums = 1:9, chars = "x")) # TRUE
is.atomic(list(1:9)) # FALSE
is.recursive(list(1:9)) # TRUE
# Matrices are atomic, data frames are recursive:
is.vector(matrix(1:9, 3)) # FALSE
is.atomic(matrix(1:9, 3)) # TRUE
is.recursive(matrix(1:9, 3)) # FALSE
is.vector(as.data.frame(matrix(1:9, 3))) # FALSE
is.atomic(as.data.frame(matrix(1:9, 3))) # FALSE
is.recursive(as.data.frame(matrix(1:9, 3))) # TRUE
Tôi nghĩ rằng bạn có thể giả sử rằng nhiều hàm, nếu không phải hầu hết, các hàm R mà bạn sử dụng thường xuyên nhất được vector hóa. Tôi không nghĩ có bất kỳ cách nào để kiểm tra điều này ngoài việc xem tài liệu hoặc các chức năng bên trong. Bất cứ khi nào bạn nghĩ về việc viết một vòng lặp for để thực hiện các thao tác phần tử đơn giản, hãy nghĩ về cách thực hiện bằng cách sử dụng vector hóa. Với thực hành đủ, nó sẽ trở thành bản chất thứ hai cho bạn. Để biết thêm chi tiết tôi có thể giới thiệu bài đăng trên blog này từ Noam Ross.