2012-09-05 3 views
5

this post Excel 파일 (코드)에서 별도의 워크 시트로 목록을 내보내는 스크립트가 있습니다. 이제 입력 목록 이름과 출력 파일 이름을 제공하여이 동작을 재현 할 수있는 편리한 함수로 포장하고 싶습니다.R 목록을 별도의 Excel 워크 시트에 저장하는 기능

샘플 데이터 :

var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4) 

현재 스크립트

require("XLConnect") 
wb <- loadWorkbook("var1.xlsx", create = TRUE) 
createSheet(wb, names(var1)) 
writeWorksheet(wb, var1, names(var1),header=FALSE) 
saveWorkbook(wb) 

면책 조항 : 나는 같은 간단한 질문을 부끄러워하는 동안, 난 확실히 다른 많은 방문자 그래서 여기에서이 정보를 찾고 싶어합니다 7)

편집 : 즉시 사용 가능한 기능 :

save.excel <-function(.list, default = 'var1', path = ''){ 
    require("XLConnect") 
    .name <- as.list(match.call())[2] 
    if(is.language(.name[[1]])) wb_name <- paste0(paste0(path, default, collapse = '/'), '.xlsx') 
    if(is.symbol(.name[[1]])) wb_name <- paste0(paste0(path, as.character(.name), collapse = '/'), '.xlsx') 
    wb <- loadWorkbook(wb_name, create = TRUE) 
    createSheet(wb, names(.list)) 
    writeWorksheet(wb,.list, names(.list),header=FALSE) 
    saveWorkbook(wb) 
    } 

아래의 솔루션에서 유일한 차이점은 내가 함수 내부에서 요청 라이브러리로 XLConnect을 추가하는 경우에, 당신은하지 않았다이다 수동으로 수행하십시오. 7)

+0

예제 코드에는 이름이 지정된 목록에 data.frames이 없습니다. – mnel

+0

'writeNamedRegion'에 대한 도움말 파일을 읽었습니까? – mnel

+0

@mnel, 감사합니다. 2 일 연속으로 두 번째로 오타를 만들었습니다. ** blush ** – dmvianna

답변

6

XLConnect가 내 컴퓨터에 설치되지 않으므로 테스트되지 않았습니다. 당신이 별도의 워크 시트

  • wb_name의 요소를 내보낼 목록 - -의 이름하지만 다음과 같은 두 개의 인수

    • my_list

      간단한 방법을

      함수를 작동 할 수 있습니다 통합 문서

    이 함수는 다음과 같습니다.

    당신은 당신이 match.call, is.symbolis.language과 재미를 가질 수있는 파일을 만들 수 list의 이름을 사용하려면 목록

    의 이름을 사용합니다 6,

    write_list <-function(my_list, wb_name = 'var1.xlsx') {  
        wb <- loadWorkbook(wb_name, create = TRUE) 
        createSheet(wb, names(my_list)) 
        writeWorksheet(wb, my_list, names(my_list),header=FALSE) 
        saveWorkbook(wb) 
    } 
    

    공상 옵션을 선택합니다. 이렇게하는 이유의 세부 사항은 두 가지 상황

    write_list_name(var1) 
    
    #in which case .name[[1]] is the symbol var1 
    

    @mnel의 솔루션에 추가
    write_list_name(list(n=2:3)) 
    # in which case .name[[1]] is list(n=2:3), and class language 
    # a file called list(n=2:3).xlsx would be not ideal, hence the `default` argument. 
    

  • +1

    가능한 경우 개체 이름에서 워크 시트의 이름을 빼면 imo가 OP 문제를 약간 산만하게합니다. 더 간단하고 예시적인 예제에서, 사용자는 xlsx 파일의 이름을 지정할 수 있습니다. 즉,'wb_name'을 인수로 사용할 수 있습니다. –

    +1

    또한,'paste0' 코드를'sprintf'에 대한 한 번의 호출로 대체 할 수 있습니다. 'sprintf ("% s/% s.xlsx", 경로, 기본값)'. –

    +0

    예, 아마도 백합을 도금하거나 푸딩을 egging하는 것입니다 (적절한 관용구를 찾으십시오). 나는 대답을 편집했다 – mnel

    2

    write_list_name <-function(.list, default = 'var1', path = ''){ 
        .name <- as.list(match.call())[2] 
        if(is.language(.name[[1]])){ 
        wb_name <- sprintf("%s/%s.xlsx", path, default) 
        } 
        if(is.symbol(.name[[1]])) { 
        wb_name <- sprintf("%s/%s.xlsx", path, as.character(.name)) 
        } 
        wb <- loadWorkbook(wb_name, create = TRUE) 
        createSheet(wb, names(.list)) 
        writeWorksheet(wb,.list, names(.list),header=FALSE) 
        saveWorkbook(wb) 
        } 
    

    is.language/is.symbol/match.call 거래 이하 다음은 함수에 대한 일반적인 정보입니다.

    function_name = function(input_a, input_b) { 
        c = input_a * 2 
        d = do_something(input_b) 
        return(list(c, d)) 
    } 
    
    input_ainput_b는 입력 인수입니다

    list(c, d) 반환 값입니다 : 일반적으로

    는, 함수는 다음과 같이 보인다. function_name, ab 기능 체에 input_ainput_b 교체하는 것이

    out_a = function_name(a, b) 
    

    주 :이 반환 값이 함수를 호출 할 때 =의 좌측에있는 개체에 할당된다. ainput_a에 링크되어 있다는 사실은 인수의 순서에 따라 수행됩니다. 양자 택일로, 명명 된 인수를 사용할 수 있습니다 :

    out_a = function(input_a = a, input_b = b) 
    

    이것은 함수 호출을 내 의견으로는 특히 잘 선택된 함수와 인자 이름에 대해 더 읽기 쉽게합니다.

    관련 문제