-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
sbtools data discovery #261
Changes from 3 commits
af216ae
159acac
44212e3
877bc6f
af1a250
4785b8e
6f877b9
1a01884
8f782ab
1a0d3ad
9b35c02
d6bd90c
854ad57
26d023f
2afd902
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,224 @@ | ||
--- | ||
title: "sbtools - Data discovery" | ||
date: "9999-07-01" | ||
author: "Lindsay R. Carr" | ||
slug: "sbtools-discovery" | ||
image: "img/main/intro-icons-300px/r-logo.png" | ||
output: USGSmarkdowntemplates::hugoTraining | ||
parent: Introduction to USGS R Packages | ||
weight: 2 | ||
draft: true | ||
--- | ||
|
||
```{r setup, include=FALSE, warning=FALSE, message=FALSE} | ||
library(knitr) | ||
|
||
knit_hooks$set(plot=function(x, options) { | ||
sprintf("<img src='../%s%s-%d.%s'/ title='%s'/>", | ||
options$fig.path, options$label, options$fig.cur, options$fig.ext, options$fig.cap) | ||
|
||
}) | ||
|
||
opts_chunk$set( | ||
echo=TRUE, | ||
fig.path="static/sbtools-discovery/", | ||
fig.width = 6, | ||
fig.height = 6, | ||
fig.cap = "TODO" | ||
) | ||
|
||
set.seed(1) | ||
``` | ||
|
||
Although ScienceBase is a great platform for uploading and storing your data, you can also use it to find other available data. You can do that manually by searching using the ScienceBase web interface or through `sbtools` functions. | ||
|
||
## Discovering data via web interface | ||
|
||
The most familiar way to search for data would be to use the ScienceBase search capabilities available online. You can search for any publically available data in the [ScienceBase catalog](https://www.sciencebase.gov/catalog/). Search by category (map, data, project, publication, etc), topic-based tags, or location; or search by your own key words. | ||
|
||
![ScienceBase Catalog Homepage](../static/img/sb_catalog_search.png#inline-img "search ScienceBase catalog") | ||
|
||
Learn more about the [catalog search features](www.sciencebase.gov/about/content/explore-sciencebase#2. Search ScienceBase) and explore the [advanced searching capabilities](www.sciencebase.gov/about/content/sciencebase-advanced-search) on the ScienceBase help pages. | ||
|
||
## Discovering data via sbtools | ||
|
||
The ScienceBase search tools can be very powerful, but lack the ability to easily recreate the search. If you want to incorporate dataset queries into a reproducible workflow, you can script them using the `sbtools` query functions. The terminology differs from the web interface slightly. Below are functions available to query the catalog: | ||
|
||
1. `query_sb` (generic SB query) | ||
2. `query_sb_text` (matches title or description) | ||
3. `query_sb_doi` (use a DOI identifier) | ||
4. `query_sb_spatial` (data within or at a specific location) | ||
5. `query_sb_date` (items within time range) | ||
6. `query_sb_datatype` (type of data, not necessarily file type) | ||
|
||
These functions take a variety of inputs, and all return an R list of `sbitems` (a special `sbtools` class). All of these functions default to 20 returned search results, but you can change that by specifying the argument `limit`. Before we practice using these functions, make sure you load the `sbtools` package in your current R session. | ||
|
||
```{r} | ||
library(sbtools) | ||
``` | ||
|
||
### Using `query_sb` | ||
|
||
`query_sb` is the "catch-all" function for querying ScienceBase from R. It only takes one argument for specifying query parameters, `query_list`. This is an R list with specific query parameters as the list names and the user query string as the list values. See the `DESCRIPTION` section of the help file for all options (`?query_sb`). | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How about **Description** instead of `DESCRIPTION`, so nobody confuses this help file section with the package DESCRIPTION file? |
||
|
||
```{r} | ||
|
||
##### THESE FIRST TWO SEARCHES STILL NEED WORK ##### | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. what additional work did you want to do on these? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think I was trying out a few other query args, like sort or something and wasn't getting what I expected. I just tried adding |
||
|
||
# search by keyword | ||
precip_query <- list(q = 'precipitation') | ||
precip_data <- query_sb(query_list = precip_query) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i personally prefer to avoid defining variables that only get used once and are already informatively labeled when they're used. therefore, if doing this myself, I'd convert lines 69-70 to precip_data <- query_sb(query_list = list(q = 'precipitation')) but i'd like to hear your case for doing it via an intermediate variable, as it currently is, and i'm fine with leaving it this way if you actively prefer it this way. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think I really had a reason...I think I just did it. Thanks for pointing it out, I agree - no need to clutter the environment for something that is used once. |
||
length(precip_data) # 50 entries, so there is likely more than 50 results | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. couple of typos in the comment. instead: length(precip_data) # 20 entries, so there are likely more than 20 results |
||
head(precip_data, 2) | ||
|
||
# search by keyword + category | ||
precip_maps_query <- list(q = 'precipitation', browseType = "Static Map Image", sort='title') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i'm confused by the documentation in
And how did you figure out that "Static Map Image" was an option? Is there a place to go find out what the options are? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, I was not sure what that meant but |
||
precip_maps_data <- query_sb(query_list = precip_query) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. here, |
||
head(precip_maps_data, 2) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. these sapply(precip_maps_data, function(item) item$title)
# [1] "Change in Precipitation (Projected and Observed) and Change in Standard Precipitation For Emissions Scenarios A2, A1B and B1 for the Gulf of Mexico"
# [2] "Precipitation as Snow (PAS)"
# [3] "Precipitation"
# [4] "Mean Annual Precipitation (MAP)"
# [5] "Mean Summer (May to Sep) Precipitation (MSP)"
# [6] "Summer (Jun to Aug) Precipitation (PPTSM)"
# [7] "Isoscapes of δ18O and δ2H reveal climatic forcings on Alaska and Yukon precipitation"
# [8] "Precipitation mm/year projections for years 2010-2080 RCP 8.5"
# [9] "Isoscapes of δ18O and δ2H reveal climatic forcings on Alaska and Yukon precipitation"
# [10] "Precipitation mm/year projections for years 2010-2080 RCP 4.5"
# [11] "Isoscapes of δ18O and δ2H reveal climatic forcings on Alaska and Yukon precipitation"
# [12] "Isoscapes of δ18O and δ2H reveal climatic forcings on Alaska and Yukon precipitation"
# [13] "Winter (Dec to Feb) Precipitation (PPTWT)"
# [14] "Isoscapes of δ18O and δ2H reveal climatic forcings on Alaska and Yukon precipitation"
# [15] "Average, Standard and Projected Precipitation for Emissions Scenarios A2, A1B, and B1 for the Gulf of Mexico"
# [16] "30 Year Mean Annual Precipitation 1960- 1990 PRISM"
# [17] "Precipitation variability and primary productivity in water-limited ecosystems: how plants 'leverage' precipitation to 'finance' growth"
# [18] "Climate change and precipitation - Consequences of more extreme precipitation regimes for terrestrial ecosystems"
# [19] "A Numerical Study of the 1996 Saguenay Flood Cyclone: Effect of Assimilation of Precipitation Data on Quantitative Precipitation Forecasts"
# [20] "A precipitation-runoff model for part of the Ninemile Creek Watershed near Camillus, Onondaga County, New York" |
||
|
||
##### -------------------------------------- ##### | ||
|
||
# search by 2 keywords | ||
hazard2_query <- list(q = 'flood', q = 'earthquake') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. cool, i didn't know you could have 2+ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I did some exploring. Here's a demo: > length(query_sb(query_list=list(q='', lq='flood OR earthquake'), limit=100))
[1] 100
> length(query_sb(query_list=list(q='', lq='flood AND earthquake'), limit=100))
[1] 62
> length(query_sb(query_list=list(q='flood AND earthquake'), limit=100))
[1] 62 therefore:
> length(query_sb(query_list=list(lq='flood AND earthquake'), limit=100))
[1] 0
> length(query_sb(query_list=list(lq='flood earthquake'), limit=100))
[1] 0 For this training doc, it would be nice to give a working example of a Lucene query and to report that a regular There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since the behavior of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. sounds good to me! |
||
hazard2_data <- query_sb(query_list = hazard2_query) | ||
length(hazard2_data) | ||
head(hazard2_data, 2) | ||
|
||
# search by 3 keywords | ||
hazard3_query <- list(q = 'flood', q = 'earthquake', q='drought') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. does the 3-keyword example show more than the 2? what about turning this example into a Lucene query or a query with the two words space-separated in a single |
||
hazard3_data <- query_sb(query_list = hazard3_query) | ||
length(hazard3_data) | ||
head(hazard3_data, 2) | ||
``` | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i was intrigued to discover today, in the SB documentation you linked to (https://www.sciencebase.gov/about/content/sciencebase-advanced-search), that you can also exclude things that meet any of the query criteria:
could this be worth including? seems like these searches do pull down a lot more than one usually wants, so filtering things out could be helpful. if you moved the generic There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Struggling with what that actually looks like via sbtools: length(query_sb(query_list = list(q = '', lq = 'flood AND earthquake', browserType = "!Application"), limit=200)) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. hmm, me neither. I tried both There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thought it might need to be escaped, but that didn't seem to make any difference. Sounds good, I will leave it alone for now! |
||
### Using `query_sb_text` | ||
|
||
`query_sb_text` returns a list of `sbitems` that match the title or description fields. Use it to search authors, station names, rivers, states, etc. | ||
|
||
```{r} | ||
# search using a contributors name | ||
contrib_results <- query_sb_text("Robert Hirsch") | ||
head(contrib_results, 2) | ||
|
||
# search using place of interest | ||
park_results <- query_sb_text("Yellowstone") | ||
head(park_results, 2) | ||
|
||
# search using a site location | ||
loc_results <- query_sb_text("Embudo") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i like these examples but am not sure how There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmmm that's very true. All of these get handled in Science Base the same way I think, right? Since it's just searching text. Could do There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. sure, either Embudo or Rio Grande is fine if you're just looking for several examples for reinforcement. Rio Grande does seem a touch more different. |
||
length(loc_results) | ||
head(loc_results, 2) | ||
``` | ||
|
||
### Using `query_sb_doi` | ||
|
||
Use a Digital Object Identifier (DOI) to query ScienceBase. This should return only one list item, unless there is more than one ScienceBase item referencing this very unique identifier. | ||
|
||
```{r} | ||
# USGS Microplastics study | ||
query_sb_doi('10.5066/F7ZC80ZP') | ||
|
||
####### I've tried A TON of DOIs I found through the web interface and just | ||
####### keep getting empty lists returned. | ||
query_sb_doi('10.1016/j.coldregions.2007.05.009') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this particular DOI seems to have a different scheme from what using the scheme embedded in > query_item_identifier(scheme='https://www.sciencebase.gov/vocab/category/item/identifier', type='DOI', key="10.1016/j.coldregions.2007.05.009")
list() using the scheme I see in the Identifiers section of https://www.sciencebase.gov/catalog/item/570bbfa7e4b0ef3b7ca0294a: > query_item_identifier(scheme='http://sciencebase.gov/vocab/identifierScheme', type='DOI', key='10.1016/j.coldregions.2007.05.009')
[[1]]
<ScienceBase Item>
Title: Snow cover effects on acoustic sensors
Creator/LastUpdatedBy: /
Provenance (Created / Updated): /
Children:
Item ID: 5771b85ae4b07657d1a6be8a
Parent ID: 5771b40fe4b07657d1a6bb5e
[[2]]
<ScienceBase Item>
Title: Snow cover effects on acoustic sensors
Creator/LastUpdatedBy: /
Provenance (Created / Updated): /
Children:
Item ID: 5762cd16e4b07657d19a82a3
Parent ID: 5762cba1e4b07657d19a7248
[[etc. to length 6]] therefore:
> known_dois <- query_item_identifier(scheme='https://www.sciencebase.gov/vocab/category/item/identifier', type='DOI')
> item_get_fields(known_dois[[12]], fields='identifiers')[[2]]$key
[1] "doi:10.5066/F77W699S" and therefore can recommend this example: > query_sb_doi('10.5066/F77W699S')
[[1]]
<ScienceBase Item>
Title: Selected Environmental Characteristics of Sampled Sites, Watersheds, and Riparian Zones for the U.S. Geological Survey Midwest Stream Quality Assessment
Creator/LastUpdatedBy: /
Provenance (Created / Updated): /
Children:
Item ID: 5714ec24e4b0ef3b7ca85d75
Parent ID: 569972c5e4b0ec051295ece5 |
||
``` | ||
|
||
### Using `query_sb_spatial` | ||
|
||
`query_sb_spatial` accepts 3 different methods for specifying a spatial area in which to look for data. You can specify a bounding box `bbox` as an `sp` spatial data object *[[[[NEED MORE TEXT HERE]]]]*. Alternatively, you can supply a vector of latitudes and a vector of longitudes using `lat` and `long` arguments. The function will automatically use the minimum and maximum from those vectors to construct a boundary box. The last way to represent a spatial region to query ScienceBase is using a POLYGON Well-known text (WKT) object as a text string. The format is `"POLYGON(([LONG1 LAT1], [LONG2 LAT2], [LONG3 LAT3]))"`, where `LONG#` and `LAT#` are longitude and latitude pairs as decimals. See the [Open Geospatial Consortium WKT standard](http://www.opengeospatial.org/standards/wkt-crs) for more information. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. up to you, but it might be easiest to split up this text description so that an example immediately follows each of the 3 methods. what other info do you want to include at There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i like the link-out idea |
||
|
||
```{r} | ||
### SPATIAL QUERY EXAMPLES NEED SOME TLC | ||
|
||
appalachia <- data.frame( | ||
lat = c(34.576900, 36.114974, 37.374456, 35.919619, 39.206481), | ||
long = c(-84.771119, -83.393990, -81.256731, -81.492395, -78.417345)) | ||
|
||
conus <- data.frame( | ||
lat = c(49.078148, 47.575022, 32.914614, 25.000481), | ||
long = c(-124.722111, -67.996898, -118.270335, -80.125804)) | ||
|
||
# verifying where points are supposed to be | ||
maps::map('usa') | ||
points(conus$long, conus$lat, col="red", pch=20) | ||
points(appalachia$long, appalachia$lat, col="green", pch=20) | ||
|
||
# query by bounding box | ||
bbox_sp_obj <- sp::SpatialPoints(appalachia) | ||
# query_sb_spatial(bbox=bbox_sp_obj) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. well, i can get this one to run without error by specifying a
but they're both returning empty lists, which doesn't seem right. are you getting empty lists for all of the examples in this section? i am. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I ran a query by interactively selecting a bounding box under "Browse by Location" at https://www.sciencebase.gov/catalog/. The resulting URL was
which shares the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How would you figure out the projection we would need? Can we just pick the And yes, I get an empty list for all of these queries. Hmmm it does look quite different. I guess it might have changed? Should we make an sbtools issue about spatial queries? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i know pitifully little about projections. maybe ask laura or a jordan? yeah, if you're getting empty lists too, i guess another sbtools issue is in order. |
||
|
||
# query by latitude and longitude vectors | ||
query_sb_spatial(long = appalachia$long, lat = appalachia$lat) | ||
query_sb_spatial(long = conus$long, lat = conus$lat) | ||
|
||
# query by WKT polygon | ||
wkt_coord_str <- paste(conus$long, conus$lat, sep=" ", collapse = ",") | ||
wkt_str <- sprintf("POLYGON((%s))", wkt_coord_str) | ||
# query_sb_spatial(bb_wkt = wkt_str) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this runs for me, just returns an unrewarding |
||
``` | ||
|
||
### Using `query_sb_date` | ||
|
||
`query_sb_date` returns ScienceBase items that fall within a certain time range. There are multiple timestamps applied to items, so you will need to specify which one to match the range. The default queries are to look for items last updated between 1970-01-01 and today's date. See `?query_sb_date` for more examples of which timestamps are available. | ||
|
||
```{r} | ||
# find data worked on in the last week | ||
today <- Sys.time() | ||
oneweekago <- today - (7*24*3600) # days * hrs/day * secs/hr | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. any interest in replacing this with oneweekago <- today - as.difftime(7, units='days') ? |
||
recent_data <- query_sb_date(start = today, end = oneweekago) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i started by wondering whether it was OK for start to come after end, then happened on this curious behavior: > recent_data <- query_sb_date(start = today, end = oneweekago, limit=10000)
> length(recent_data)
[1] 114
> recent_data <- query_sb_date(end = today, start = oneweekago, limit=10000)
> length(recent_data)
[1] 122 ...i don't know what to make of this. datetimes do get converted to dates (https://github.com/USGS-R/sbtools/blob/master/R/query_sb_date.R#L36), maybe one of start/end is inclusive while the other is exclusive? i guess i'd recommend demonstrating with dates rather than datetimes, given that query_sb_date simplifies to dates no matter what. the inclusive/exclusive thing is curious but probably not worth teaching here. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Tried doing this with Dates instead of datetimes, but still seeing this curious behavior...
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. wow, that's a much bigger difference than I saw! i guess it's possible that >=9593 items were created exactly on that said, i didn't actually expect the Date approach to change the behavior - just to help clarify that Dates are the best precision you can hope for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, that seems like something we don't need to defend against here. Ah I see your point in doing that. I'll update it. |
||
head(recent_data, 2) | ||
|
||
# find data that's been created over the last year | ||
oneyearago <- today - (365*24*3600) # days * hrs/day * secs/hr | ||
recent_data <- query_sb_date(start = today, end = oneyearago, date_type = "dateCreated") | ||
head(recent_data, 2) | ||
``` | ||
|
||
### Using `query_sb_datatype` | ||
|
||
`query_sb_datatype` is used to search ScienceBase by the type of data an item is listed as. Run `sb_datatypes()` to get a list of 50 available data types. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ooh, good tip! and looks like this is also the list of possible |
||
|
||
```{r} | ||
# get ScienceBase news items | ||
sbnews <- query_sb_datatype("News") | ||
head(sbnews, 2) | ||
|
||
# find shapefiles | ||
shps <- query_sb_datatype("Shapefile") | ||
head(shps, 2) | ||
|
||
# find raster data | ||
sbraster <- query_sb_datatype("Raster") | ||
head(sbraster, 2) | ||
``` | ||
|
||
## Best of both methods | ||
|
||
Although you can query from R, sometimes it's useful to look an item on the web interface. You can use the `query_sb_*` functions and then follow that URL to view items on the web. This is especially handy for viewing maps and metadata, or to check or repair a ScienceBase item if any of the `sbtools`-based commands have failed. | ||
|
||
```{r} | ||
sbmaps <- query_sb_datatype("Static Map Image", limit=3) | ||
oneitem <- sbmaps[[1]] | ||
|
||
# get and open URL from single sbitem | ||
url_oneitem <- oneitem[['link']][['url']] | ||
browseURL(url_oneitem) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||
|
||
# get and open URLs from many sbitems | ||
lapply(sbmaps, function(sbitem) { | ||
url <- sbitem[['link']][['url']] | ||
browseURL(url) | ||
return(url) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. could this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Was thinking that it would be nice to just print out the URLs that were opened. I don't know why, but I generally don't like functions that don't return anything. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ok, fine with me. |
||
}) | ||
``` | ||
|
||
## No results | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe this should go above Best of Both Methods, given that it refers to the first method only? |
||
|
||
Some of your queries will probably return no results. When there are no results that match your query, the returned list will have a length of 0. | ||
|
||
```{r} | ||
# search for items related to a Water Quality Portal paper DOI | ||
query_results <- query_sb_doi(doi = '10.1002/2016WR019993') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. lol. making good use of a dead end from your work on the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not that I know of! |
||
length(query_results) | ||
head(query_results) | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this list is very helpful - nice to see all the options in one place.
i wonder if we can say any more about query_sb() in particular here...i think it's more flexible than the other 5, right? can it do everything that the other 5 can, and more? when would a user want to use this one instead of one of the others? do we know any of the things this one can do that the others can't? could it make sense to put this at the end of the list so that you can explain this one as a generalization of the others in the text that follows?