2013-06-13 4 views
-1

...을 인수로 취한 다음 함수 본문에 lapply(..., length)이있는 함수를 작성하는 데 문제가 있습니다.lapply에 '...'인수 전달

현재 내 코드 (중요한 부분은 2 행에)입니다 :

paste1 <- function(..., sep = " ", collapse = NULL) { 
    if(isTRUE(unique(as.logical(lapply(X = ..., FUN = length))))) 
     if(length(sep)) paste(..., sep = sep, collapse = collapse) 
     else paste0(..., collapse = collapse) 
    else 
     "" 
} 

말썽이 lapply(X = ..., FUN = length) 부분입니다. ... 인수에 둘 이상의 요소가있는 경우 length은 모든 인수에 한 번에 적용하려고 시도합니다. 이는 length에 하나의 인수 만 있기 때문에 오류가 발생합니다. ...의 요소 중 일부는 NULL 수 있으며 ...의 목록 표현이 손실 된 정보를 가지고 있기 때문에

나는 lapply(X = as.list(...), FUN = length) 같은 것을 사용할 수 없습니다.

...의 개별 요소에 먼저 length을 적용하면됩니다. 먼저 강제 변환하지 않아도됩니다.

+2

'as.list'대신'list'를 사용 하시겠습니까? – joran

+1

예제 입력/사용을 보여줄 수 있습니까? 나는'dots-list (...)'와'lapply (dots, length)'를하면 문제를 재현 할 수 없다. –

+0

감사합니다.'list '가'as.list'와는 다르다는 것을 몰랐습니다. –

답변

3

이 버전이 입력에 실패하지 않는 것 같다 dots <- list(...)을 사용

> paste1(A = "foo", B = NULL, C = c("bar","foo")) 
[1] "" 

나는 당신의 기능을 수행하려고하는 것을 보았다하지 않으며이 유효한 입력 여부,하지만 lapply(X = dots, FUN = length) 당신이 원하는 것을 dots <- list(...)NULL을 유지합니다.

paste1 <- function(..., sep = " ", collapse = NULL) { 
    dots <- list(...) 
    if(isTRUE(unique(as.logical(lapply(X = dots, FUN = length))))) 
     if(length(sep)) paste(dots, sep = sep, collapse = collapse) 
     else paste0(dots, collapse = collapse) 
    else 
     "" 
} 
+0

' 실제로 '...'인수를 사용하는 as.list' 메서드는 무엇입니까? 찾을 수없는 것 같습니다. "future"옵션 만 있습니까? – joran

+0

실제로 - OP에서 언급 한 문제를 재현 할 수 없습니다. 'as.list()'가 방금 오류가 발생했기 때문입니다. –