현재로 서서는 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
? 그것은 조정할 수있는 템플릿 객체를 빌드하고 반환하는 함수를 작성하는 것보다 읽기 쉽지 않은 것처럼 보입니다. – Vince
테스팅 목적으로 작은 폴리곤을 저장하려고 할 때 알아 차린 것입니다. 나는 n * 2 행렬과 그것에 약간의 저글링을하는 함수를 갖는 것이 더 쉽다는 것에 동의한다. –