[편집 :.이 해결 방법을 묻는 문제는 R 3.1.0 이후 수정되었습니다]R : 함수가 메모리에서 매개 변수를 복사하지 않고 줄임표 (...)를 사용하여 변수 인수를 수락하는 방법은 무엇입니까?
나는 자기 대답 질문으로 이것을 게시 할 다른 질문을 받았다.
는 R 함수 생략 아규먼트 파라미터의 임의의 번호에 액세스 할 수있는 일반적인 방법을 허용
는list(...)
를 사용 :
f <- function(...) {
dots <- list(...)
# Let's print them out.
for (i in seq_along(dots)) {
cat(i, ": name=", names(dots)[i], "\n", sep="")
print(dots[[i]])
}
}
> f(10, a=20)
1: name=
[1] 10
2: name=a
[1] 20
을하지만, (v3.0.2 기준) R 깊은 사본 모든 list
요소 : 당신이 메모리 프로파일을 사용할 경우
> x <- 10
> .Internal(inspect(x))
@10d85ca68 14 REALSXP g0c1 [MARK,NAM(2),TR] (len=1, tl=0) 10
> x2 <- x
> .Internal(inspect(x2)) # Not copied.
@10d85ca68 14 REALSXP g0c1 [MARK,NAM(2),TR] (len=1, tl=0) 10
> y <- list(x)
> .Internal(inspect(y[[1]])) # x was copied to a different address:
@10dd45e88 14 REALSXP g0c1 [MARK,NAM(1),TR] (len=1, tl=0) 10
> z <- list(y)
> .Internal(inspect(z)) # y was deep-copied:
@10d889ed8 19 VECSXP g0c1 [MARK,NAM(1)] (len=1, tl=0)
@10d889f38 19 VECSXP g0c1 [MARK,TR] (len=1, tl=0)
@10d889f68 14 REALSXP g0c1 [MARK] (len=1, tl=0) 10
당신은뿐만 아니라 tracemem
으로이를 확인할 수 있습니다.
큰 개체를 list
에 저장 했습니까? 복사 됨. list(...)
을 호출하는 함수에 전달합니까? 복사 됨 :
> g <- function(...) for (x in list(...)) .Internal(inspect(x))
> g(z) # Copied.
@10dd45e58 19 VECSXP g0c1 [] (len=1, tl=0)
@10dd35fa8 19 VECSXP g0c1 [] (len=1, tl=0)
@10dd36068 19 VECSXP g0c1 [] (len=1, tl=0)
@10dd36158 14 REALSXP g0c1 [] (len=1, tl=0) 10
> g(z) # ...copied again.
@10dd32268 19 VECSXP g0c1 [] (len=1, tl=0)
@10d854c68 19 VECSXP g0c1 [] (len=1, tl=0)
@10d8548d8 19 VECSXP g0c1 [] (len=1, tl=0)
@10d8548a8 14 REALSXP g0c1 [] (len=1, tl=0) 10
아직 끔찍하지 않습니까? R 라이브러리 소스에서 grep -l "list(\.\.\.)" *.R
을 시도하십시오. 내가 가장 좋아하는 단어는 mapply
/Map
으로, GB의 데이터를 자주 호출하고 메모리가 부족한 이유가 궁금합니다. 적어도 lapply
이면 좋습니다.
따라서 ...
개의 변수를 가진 함수를 작성하고 복사하지 않으려면 어떻게해야합니까?
목록을 처리 할 때 요소 복사가 눈치 챘지만 새로운 "기능"임을 알지 못했습니다. – BrodieG
나는 그것이 새로운 것 같지 않습니다. 나는 버전이 미래에 바뀔 경우를 대비해 언급했다. – codeola
실제로 3.1.0에서 수정되었습니다 – hadley