나는 아직도 배우고있다 R
. R
operation
또는 a 인지 식별하는 자동화 된 방법 function
이 vectorized
있습니까? 경우 확인하려면 R
객체가이다 vector
, 내가 사용할 수 있습니다 is.vector(x)
, 어떤 수익을 TRUE
경우 x
벡터 또는 False
그렇지. 비슷한 것이 vectorized
있습니까?
예를 들면 :
x <- c(1,2,3)
y <- c(3,4,5)
x+y
#[1] 4 6 8
이후 +
벡터화, 그것은 자동 adds
벡터의 개별 요소 x
의 각각의 요소 y
. 그렇지 않으면 for
유사한 출력을 얻기 위해 루프를 사용해야합니다 .
for(i in seq_along(x)){
cat(sprintf("%i ", x[i]+y[i]))
}
#4 6 8
지금까지 용어에 대한 나의 제한된 이해 Vectorized
는 벡터의 개별 요소에 대해 하나씩 수행해야하는 요소에 대한 자동 작업을 수반합니다.
당신이 경우 식별하는 데 사용하는 것이 좋습니다하는 방법이있다 operation
나 function
에가 R
있다가 vectorized
?
감사합니다.
R의 벡터화는 기본적으로 모든 루핑이 C 또는 FORTRAN과 같은 더 빠르고 컴파일 된 언어로 이동됨을 의미합니다. 이를 위해 문제의 벡터는 "원자 적"이어야합니다. 즉, "평평하고"동종 typeof()
이어야합니다.으로 확인할 수있는 벡터 유형 은 수행중인 작업에 적합해야합니다. 원자 적이면 벡터화됩니다.
을 사용하여 벡터가 원자인지 확인할 수 있습니다 is.atomic()
. 벡터화 되지 않은 또 다른 유형의 벡터는 "재귀"라고하며을 사용하여 확인할 수 있습니다 is.recursive()
. 재귀 객체는 모든 유형의 다른 객체를 포함 할 수 있습니다. 즉, 이질적 일 수 있습니다. 목록과 데이터 프레임은 재귀 적입니다.
원자 대 재귀에 대한 통찰력을 얻으려면 다음과 같이 시도하십시오.
# 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
가장 자주 사용하는 R 함수 중 대부분은 아니지만 많은 것이 벡터화되었다고 가정 할 수 있습니다. 문서 나 함수 내부를 보는 것 외에는 이것을 확인할 방법이 없다고 생각합니다. 간단한 요소 별 연산을 수행하기 위해 for 루프를 작성하는 것에 대해 생각할 때마다 벡터화를 사용하여 수행하는 방법에 대해 생각하십시오. 충분한 연습을하면 그것은 당신에게 제 2의 천성이 될 것입니다. 자세한 내용 은 Noam Ross 의이 블로그 게시물 을 추천 할 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다