抑制打印输出 sf 对象

suppress print output sf object

我正在尝试将 sf 对象的 head 等价物保存在列表中。当您在 sf class 上使用 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...

我以为 invisiblesink 会抑制输出,但我想不通,none 这些工作:

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))))

有什么建议吗?谢谢

编辑: 使用 invisiblecapture.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..." 

可能是一个糟糕的方法,不知道 return 值将受到什么进一步处理(我觉得单独的暗淡,head_sf 是不可取的),如果你厌恶的话尤其糟糕循环,但使用 invisible(capture.output 的变体 :

library(sf)
library(tidyverse)
nc <- st_read(system.file("shape/nc.shp", package = "sf"))
nc1 <- nc
nc2 <- nc
nc3 <- nc
nc_lst <- list(nc1, nc2, nc3)

prepare_sf_head_for_further_process_loop3 <- function(nc_lst) { 
a_quote <- list()
for(i in 1:length(nc_lst)) {
invisible(capture.output(a_quote[[i]] <- list(dims = dim(nc_lst[[i]]), head_sf = print(nc_lst[[i]], n = getOption('sf_max_print', default = 6)))))
}
return(a_quote)
}


>b3 <- prepare_sf_head_for_further_process_loop3(nc_lst)
>b3
[[1]]
[[1]]$dims
[1] 100  15

[[1]]$head_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
First 10 features:
    AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
   NWBIR74 BIR79 SID79 NWBIR79                       geometry
1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
4      123   830     2     145 MULTIPOLYGON (((-76.00897 3...
5     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
6      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
7      115   350     2     139 MULTIPOLYGON (((-76.00897 3...
8      254   594     2     371 MULTIPOLYGON (((-76.56251 3...
9      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
10     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...

>class(nc_lst[[1]]
[1] "sf"         "data.frame"
>class(b3[[1]]$head_sf)
[1] "sf"         "data.frame"

该死,不知道为什么 getOption('sf_max_print', default = 6) 没有限制为 6。 dplyer控制了quote/unquote,但我还没有研究出对此的应用。到目前为止,这些是我的错误建议。

另外,从 tidyverse What Hadley suggests,拿下 Hadley 并交换头部和打印,

glimpse_head2 <- function(x, n = 6) {
head(print(x, n))
invisible(x)
} 

虽然这并没有变暗,但似乎比我上面的要简单得多,并且提供了所需的 bbox 值。并且仍然不限制为 6,因为 sfg 的 head 方法被硬编码为 10L:

> getS3method('head', 'sfg')
function (x, n = 10L, ...) 
{
    structure(head(unclass(x), n = n, ...), class = class(x))
}
<bytecode: 0x5646a6a38228>
<environment: namespace:sf>