Làm thế nào để tôi biết một chức năng hoặc một hoạt động trong R được vector hóa?


8

Tôi vẫn đang học R. Có một số cách tự động để xác định nếu một R operationhoặc functionvectorized? Để xác định nếu một Rđối tượng là một vector, tôi có thể sử dụng is.vector(x), nó trả về TRUEnếu xlà một vectơ hoặc Falsecách khác. Có một cái gì đó tương tự cho vectorized?

Ví dụ:

x <- c(1,2,3)
y <- c(3,4,5)
x+y
#[1] 4 6 8

Vì, +được vector hóa, nó tự động addscác phần tử riêng lẻ của một vectơ xvới các phần tử riêng lẻ của y. Mặt khác, tôi phải sử dụng một forvòng lặp để đạt được đầu ra tương tự.

for(i in seq_along(x)){
  cat(sprintf("%i ", x[i]+y[i]))
}
#4 6 8 

Sự hiểu biết hạn hẹp của tôi về thuật ngữ này Vectorizedđòi hỏi phải vận hành tự động trên các phần tử mà tôi thường phải làm trên từng phần tử của một vectơ.

Có một phương pháp bạn khuyên bạn nên sử dụng để xác định nếu một operationhoặc một functiontrong Rvectorized?

Cảm ơn bạn.

Câu trả lời:


3

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.


@AnonMousy rất vui khi được giúp đỡ. Nếu câu trả lời giúp bạn, bạn sẽ cân nhắc chọn nó làm câu trả lời được chấp nhận bằng cách nhấp vào √? Bằng cách đó, những người khác với một câu hỏi tương tự biết những gì làm việc quá.
gersht

0

Về nguyên tắc, nó phải rõ ràng từ trang trợ giúp help(function)hoặc ?functionnên đưa ra câu trả lời.


Đó là một điểm khởi đầu được đề nghị. Nếu bạn muốn sử dụng các hàm vectơ bất cứ khi nào có thể trong chương trình bạn viết, đó có thể là một chút tải bổ sung.
Anon Mousy

1
Điều này không thực sự trả lời câu hỏi. Đó chỉ là một gợi ý cho RTM.
IRTFM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.