2017-11-21 4 views
1

R의 내 지식 (아마도 무지한)은 메모리의 객체를 임시로 복사한다는 것입니다. 전역 환경의 객체가 너무 커서 복사 할 수있는 경우에도 함수를 사용하여 코드를 단순화하는 방법은 무엇입니까? 또는 함수를 조작하기 위해 큰 개체의 필요한 부분 만 하위 집합으로 만드는 것이 좋습니다.r 함수가 객체의 복사본이 아닌 전역 환경에서 객체를 사용하도록 요구하십시오.

# load two objects with 10 million rows and 500 columns 
big.object.1 <- readRDS(file = "previously.created.dataframe.1") 
big.object.2 <- readRDS(file = "previously.created.dataframe.2") 

# method 1 with memory use of ~xMB? 
big.object.1$recoded.column <- ifelse(big.object.1$old.column > 0, 
             big.object.1$recoded.column * 2, 
             big.object.1$recoded.column * 0.5) 

# method 2 with memory use of ~2xMB? 
new.column_function <- function(data, old.col, recoded.col) { 
    data[recoded.col] <- ifelse(data[old.col] > 0, 
           data[recoded.col] * 2, 
           data[recoded.col] * 0.5) 
} 

new.column_function(data = big.object.1, 
        recoded.col = 400, 
        new.col = 401) 

코드가 기능하지 않고 복잡하지만, 메모리 기능 문제입니다 가장 좋은 방법은 무엇입니까? 큰 개체를 복사하지 않으려면 어떻게해야합니까?

+3

메모리가 당신의 data.frame.' : = '에 문제가있을 때'data.table'을 시도해 볼 수 있으며, 열의 하위 집합을 참조로 빠르게 추가, 제거 및 업데이트 할 수 있습니다. – myincas

+0

@ incas56, 대답으로 간단한 예를 들려 줄 수 있습니까? 어쩌면 data.table을 data.table로 변환 한 다음 위에서 지정한대로 data.table을 조작합니까? 감사. – jtd

답변

0

당신은

new.column_function <- function(old.col, recoded.col) { 

    ind <- big.object[old.col] > 0 

    # Do this 
    big.object[recoded.col] <<- ifelse(ind, big.object[recoded.col][ind] * 2, 
             big.object[recoded.col][ind] * 0.5) 

    # OR do this 
    big.object[recoded.col][ind] <<- big.object[recoded.col][ind] * 2 
    big.object[recoded.col][!ind] <<- big.object[recoded.col][!ind] * 0.5 

    # Don't think this behaves in the intended way... 
    #   ifelse(big.object[old.col] > 0, 
    #        big.object[recoded.col] * 2, 
    #        big.object[recoded.col] * 0.5) 
} 

data.table을 사용하는 것보다 더 나은 경우 나도 몰라 <<- (대신 <-)를 사용하여 함수 내에서 지구 환경의 개체에 액세스 할 수 있습니다.

+0

내가 big.object.1 및 big.object.2 있다고 가정합니다. 따라서, 나는 어떤 개체 (예 : function (big.object, old.col, recoded.col))를 지정하는 함수 매개 변수가 필요하다고 생각합니다. _will this는 여전히 big.object.2의 복사본을 만드는 것을 피할 것입니다. new.column_function (big.object.2, 400, 401)을 호출하고 << for - 함수 내에서 assignment_를 사용하면? 또는 big.object.1에 하나의 함수를 제안하고 big.object.2에 대해 두 번째 함수를 제안 할 것입니까? – jtd

+0

'new.column_function (big.object.2, 400, 401)'은'big.object.2'의 복사본을 생성합니다. 그건 그렇고 ** ifelse ** 잘못입니다. – Suren

+0

'ifelse'를 사용하는 방식에 문제가 있다고 생각합니다. 편집 된 솔루션에서 접근 방법 중 하나를 시도하십시오. – Suren

0

당신이 함수에 OBJEKT의 이름이 경우가 아니라 전체 개체

new.column_function <- function(nameOfData, old.col, recoded.col) { 
    get(nameOfData)[recoded.col] <- ifelse(data[old.col] > 0, 
           data[recoded.col] * 2, 
           data[recoded.col] * 0.5) 
} 

를 제공하려고 만하는 기능 getassign를 사용할 수는 nameOfData 예를 들어 값 big.object.1와 문자열

관련 문제