2010-08-12 3 views
7

dput() S4 개체는 어떻게됩니까? 나는 이것을 시도했다S4 개체를 dodting

require(sp) 
require(splancs) 
plot(0, 0, xlim = c(-100, 100), ylim = c(-100, 100)) 
poly.d <- getpoly() #draw a pretty polygon - PRETTY! 
poly.d <- rbind(poly.d, poly.d[1,]) # close the polygon because of Polygons() and its kin 
poly.d <- SpatialPolygons(list(Polygons(list(Polygon(poly.d)), ID = 1))) 
poly.d 
dput(poly.d) 

내가 dput() S4 개체 인 경우, 나는 그것을 다시 재구성 할 수 없다. 당신의 생각?

+1

? 그것은 조정할 수있는 템플릿 객체를 빌드하고 반환하는 함수를 작성하는 것보다 읽기 쉽지 않은 것처럼 보입니다. – Vince

+0

테스팅 목적으로 작은 폴리곤을 저장하려고 할 때 알아 차린 것입니다. 나는 n * 2 행렬과 그것에 약간의 저글링을하는 함수를 갖는 것이 더 쉽다는 것에 동의한다. –

답변

9

현재로 서서는 dput 수 없습니다. dput의 코드는 다음 루프가 포함

if (isS4(x)) { 
    cat("new(\"", class(x), "\"\n", file = file, sep = "") 
    for (n in slotNames(x)) { 
     cat(" ,", n, "= ", file = file) 
     dput(slot(x, n), file = file, control = control) 
    } 
    cat(")\n", file = file) 
    invisible() 
} 

이것은 S4 재귀 적 객체 처리를하지만, 그것은 S4 객체를 포함하지 것이다 S3 객체는 당신의 예제에서 이는 보유하지 않는 가정에 의존 :

> isS4(slot(poly.d,'polygons')) 
[1] FALSE 
> isS4(slot(poly.d,'polygons')[[1]]) 
[1] TRUE 

편집 : 여기에 dput의 제한 사항이 있습니다. 제공 한 예에서 작동하지만 일반적으로 작동하지는 않습니다 (예 : 속성을 처리하지 않음).

dput2 <- function (x, 
        file = "", 
        control = c("keepNA", "keepInteger", "showAttributes")){ 
    if (is.character(file)) 
     if (nzchar(file)) { 
      file <- file(file, "wt") 
      on.exit(close(file)) 
     } 
     else file <- stdout() 
    opts <- .deparseOpts(control) 
    if (isS4(x)) { 
     cat("new(\"", class(x), "\"\n", file = file, sep = "") 
     for (n in slotNames(x)) { 
      cat(" ,", n, "= ", file = file) 
      dput2(slot(x, n), file = file, control = control) 
     } 
     cat(")\n", file = file) 
     invisible() 
    } else if(length(grep('@',capture.output(str(x)))) > 0){ 
     if(is.list(x)){ 
     cat("list(\n", file = file, sep = "") 
     for (i in 1:length(x)) { 
      if(!is.null(names(x))){ 
      n <- names(x)[i] 
      if(n != ''){ 
       cat(" ,", n, "= ", file = file) 
      } 
      } 
      dput2(x[[i]], file = file, control = control) 
     } 
     cat(")\n", file = file) 
     invisible() 
     } else { 
     stop('S4 objects are only handled if they are contained within an S4 object or a list object') 
     } 
    } 
    else .Internal(dput(x, file, opts)) 
} 

그리고 여기에 행동에 : 당신은 왜 이런 식으로 객체를 구축하고자 할

> dput2(poly.d,file=(tempFile <- tempfile())) 
> poly.d2 <- dget(tempFile) 
> all.equal(poly.d,poly.d2) 
[1] TRUE 
+0

큰 도움이되었습니다! 감사. 한 가지 수정이 필요했습니다 : dput2에 대한 마지막 재귀 호출 전에이 줄을 추가하십시오 : if (i> 1) cat (","file = file)' – Roger