【发布时间】:2020-11-03 21:55:41
【问题描述】:
我正在尝试将 head 的等价物保存在列表中。当您在 sf 类上使用 head 时,它会向控制台打印一些关于数据周长的误导性信息,请参阅 bbox 信息与原始信息不同:
library(sf)
library(tidyverse)
nc <- st_read(system.file("shape/nc.shp", package = "sf"))
# Simple feature collection with 100 features and 14 fields
# geometry type: MULTIPOLYGON
# dimension: XY
# bbox: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
# geographic CRS: NAD27
head(nc)
# Simple feature collection with 6 features and 14 fields
# geometry type: MULTIPOLYGON
# dimension: XY
# bbox: xmin: -81.74107 ymin: 36.07282 xmax: -75.77316 ymax: 36.58965
# geographic CRS: NAD27
# AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74 NWBIR74 BIR79 SID79 NWBIR79 geometry
# 1 0.114 1.442 1825 1825 Ashe 37009 37009 5 1091 1 10 1364 0 19 MULTIPOLYGON (((-81.47276 3...
# 2 0.061 1.231 1827 1827 Alleghany 37005 37005 3 487 0 10 542 3 12 MULTIPOLYGON (((-81.23989 3...
# 3 0.143 1.630 1828 1828 Surry 37171 37171 86 3188 5 208 3616 6 260 MULTIPOLYGON (((-80.45634 3...
# 4 0.070 2.968 1831 1831 Currituck 37053 37053 27 508 1 123 830 2 145 MULTIPOLYGON (((-76.00897 3...
# 5 0.153 2.206 1832 1832 Northampton 37131 37131 66 1421 9 1066 1606 3 1197 MULTIPOLYGON (((-77.21767 3...
# 6 0.097 1.670 1833 1833 Hertford 37091 37091 46 1452 7 954 1838 5 1237 MULTIPOLYGON (((-76.74506 3...
那是因为我认为它为前 6 次观察而不是整个数据框计算 bbox。作为替代方案,您可以运行以下print(请参阅bbox 与完整数据集相同):
print(nc, n = getOption("sf_max_print", default = 6))
# Simple feature collection with 100 features and 14 fields
# geometry type: MULTIPOLYGON
# dimension: XY
# bbox: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
# geographic CRS: NAD27
# First 6 features:
# AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74 NWBIR74 BIR79 SID79 NWBIR79 geometry
# 1 0.114 1.442 1825 1825 Ashe 37009 37009 5 1091 1 10 1364 0 19 MULTIPOLYGON (((-81.47276 3...
# 2 0.061 1.231 1827 1827 Alleghany 37005 37005 3 487 0 10 542 3 12 MULTIPOLYGON (((-81.23989 3...
# 3 0.143 1.630 1828 1828 Surry 37171 37171 86 3188 5 208 3616 6 260 MULTIPOLYGON (((-80.45634 3...
# 4 0.070 2.968 1831 1831 Currituck 37053 37053 27 508 1 123 830 2 145 MULTIPOLYGON (((-76.00897 3...
# 5 0.153 2.206 1832 1832 Northampton 37131 37131 66 1421 9 1066 1606 3 1197 MULTIPOLYGON (((-77.21767 3...
# 6 0.097 1.670 1833 1833 Hertford 37091 37091 46 1452 7 954 1838 5 1237 MULTIPOLYGON (((-76.74506 3...
如何在不打印到控制台的情况下将此打印对象保存在列表中(稍后将在函数中使用)?
当我粗鲁地将它放在一个列表中而不试图抑制它按预期打印的输出时:
a <- lst(dim(nc), head_sf = print(nc, n = getOption("sf_max_print", default = 6)))
# Simple feature collection with 100 features and 14 fields
# geometry type: MULTIPOLYGON
# dimension: XY
# bbox: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
# geographic CRS: NAD27
# First 6 features:
# AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74 NWBIR74 BIR79 SID79 NWBIR79 geometry
# 1 0.114 1.442 1825 1825 Ashe 37009 37009 5 1091 1 10 1364 0 19 MULTIPOLYGON (((-81.47276 3...
# 2 0.061 1.231 1827 1827 Alleghany 37005 37005 3 487 0 10 542 3 12 MULTIPOLYGON (((-81.23989 3...
# 3 0.143 1.630 1828 1828 Surry 37171 37171 86 3188 5 208 3616 6 260 MULTIPOLYGON (((-80.45634 3...
# 4 0.070 2.968 1831 1831 Currituck 37053 37053 27 508 1 123 830 2 145 MULTIPOLYGON (((-76.00897 3...
# 5 0.153 2.206 1832 1832 Northampton 37131 37131 66 1421 9 1066 1606 3 1197 MULTIPOLYGON (((-77.21767 3...
# 6 0.097 1.670 1833 1833 Hertford 37091 37091 46 1452 7 954 1838 5 1237 MULTIPOLYGON (((-76.74506 3...
我以为invisible 或sink 会抑制输出,但我想不通,这些都不起作用:
a <- invisible(lst(dim(nc), head_sf = print(nc, n = getOption("sf_max_print", default = 6))))
a <- lst(dim(nc), head_sf = invisible(print(nc, n = getOption("sf_max_print", default = 6))))
a <- lst(dim(nc), invisible(head_sf = print(nc, n = getOption("sf_max_print", default = 6))))
有什么建议吗?谢谢
编辑:
使用 invisible 和 capture.output 几乎可以得到我想要的(我最初发布此内容时输出不正确 - 我的错误)
a <- lst(dim(nc), invisible(capture.output(head_sf = print(nc, n = getOption("sf_max_print", default = 6)))))
a
$`dim(nc)`
[1] 100 15
$`invisible(...)`
[1] "Simple feature collection with 100 features and 14 fields"
[2] "geometry type: MULTIPOLYGON"
[3] "dimension: XY"
[4] "bbox: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965"
[5] "geographic CRS: NAD27"
[6] "First 6 features:"
[7] " AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74 NWBIR74 BIR79 SID79 NWBIR79 geometry"
[8] "1 0.114 1.442 1825 1825 Ashe 37009 37009 5 1091 1 10 1364 0 19 MULTIPOLYGON (((-81.47276 3..."
[9] "2 0.061 1.231 1827 1827 Alleghany 37005 37005 3 487 0 10 542 3 12 MULTIPOLYGON (((-81.23989 3..."
[10] "3 0.143 1.630 1828 1828 Surry 37171 37171 86 3188 5 208 3616 6 260 MULTIPOLYGON (((-80.45634 3..."
[11] "4 0.070 2.968 1831 1831 Currituck 37053 37053 27 508 1 123 830 2 145 MULTIPOLYGON (((-76.00897 3..."
[12] "5 0.153 2.206 1832 1832 Northampton 37131 37131 66 1421 9 1066 1606 3 1197 MULTIPOLYGON (((-77.21767 3..."
[13] "6 0.097 1.670 1833 1833 Hertford 37091 37091 46 1452 7 954 1838 5 1237 MULTIPOLYGON (((-76.74506 3..."
【问题讨论】:
-
也许使用
quote来禁止打印到控制台,然后在a_quote$head_sf上使用eval:a_quote <- quote(lst(dim(nc), head_sf = print(nc, n = getOption("sf_max_print", default = 6))));eval(a_quote$head_sf)? -
@Chris 谢谢,这很有用,但是当我在函数中尝试它时,它无法按预期工作
mylist <- lst(nc); b <- lapply(mylist, function(x) { a_quote <- quote(lst(dims = dim(x), head_sf = print(x, n = getOption("sf_max_print", default = 6)))) eval(a_quote$dims) eval(a_quote$head_sf) } );b,当我调用b时,它会自动打印但不会评估dims或@987654346 @? -
似乎是一种范围界定的事情。 Quote 将所有内容包装起来以供以后处理,并禁止打印到控制台,并保留正确的 bbox。现在,把这一切都扔进
lapply(头疼,眼睛流血),也许想要do.calleval(s),或者这可能是mapply土地。总之,我们正在寻找=c)))) ;和eval(a_quo之前或之后(或之间)的东西。好的,我会玩,抱歉,这不是更确定的。