Skip to content

Instantly share code, notes, and snippets.

@knapply
Last active May 17, 2020 23:50
Show Gist options
  • Save knapply/a00293dad3cd09c658c7b7bb4da8c6c1 to your computer and use it in GitHub Desktop.
Save knapply/a00293dad3cd09c658c7b7bb4da8c6c1 to your computer and use it in GitHub Desktop.
simdjson R experiments
simdjson_parse <- function(x, json_pointer = "",
                           int64 = c("auto", "integer64", "string", "double"),
                           error_on_bad_parse = TRUE) {
  int64 <- match.arg(int64, c("auto", "integer64", "string", "double"))
  
  if (int64 %in% c("auto", "integer64")) {
    bit64_available <- requireNamespace("bit64", quietly = TRUE)
    if (int64 == "integer64" && !bit64_available) {
      stop('`int64` set to `"integer64"`, but {bit64} is not installed.')
    }
    if (bit64_available) { # int64_t as bit64::integer64
      out <- .parse_json_impl(
        json = x, json_pointer,
        bit64_integer64 = TRUE, int_64_strings = FALSE,
        error_on_bad_parse = error_on_bad_parse
      )
    } else {
      int64 = "string"
    }

  }
  
  if (int64 == "string") { # int64_t as character
    out <- .parse_json_impl(
      json = x, json_pointer,
      bit64_integer64 = FALSE, int_64_strings = TRUE,
      error_on_bad_parse = error_on_bad_parse
    )
  } else { # int64_t as double
    out <- .parse_json_impl(
      json = x, json_pointer,
      bit64_integer64 = FALSE, int_64_strings = FALSE,
      error_on_bad_parse = error_on_bad_parse
    )
  }
  
  if (length(out) > 1L) out else out[[1L]]
}
simdjson_parse("[]")
## list()
simdjson_parse("{}")
## named list()
simdjson_parse('{"simd":["j","s","o","n"]}')
## $simd
## $simd[[1]]
## [1] "j"
## 
## $simd[[2]]
## [1] "s"
## 
## $simd[[3]]
## [1] "o"
## 
## $simd[[4]]
## [1] "n"
simdjson_parse(c("bad_json", '{"good_json":true}'))
## Error in .parse_json_impl(json = x, json_pointer, bit64_integer64 = TRUE, : parse error
simdjson_parse(c("bad_json", '{"good_json":true}'), error_on_bad_parse = FALSE)
## Warning in .parse_json_impl(json = x, json_pointer, bit64_integer64 = TRUE, :
## parse error

## [[1]]
## NULL
## 
## [[2]]
## [[2]]$good_json
## [1] TRUE
simdjson_parse('{"ints":[1,2,3]}')
## $ints
## $ints[[1]]
## [1] 1
## 
## $ints[[2]]
## [1] 2
## 
## $ints[[3]]
## [1] 3
is.integer(unlist(simdjson_parse('{"ints":[1,2,3]}')))
## [1] TRUE
simdjson_parse('{"big_int":1178007955838509057}')
## $big_int
## integer64
## [1] 1178007955838509057
simdjson_parse('{"big_int":2356015911677018114}', int64 = "string")
## $big_int
## [1] "2356015911677018114"
simdjson_parse('{"big_int":3534023867515527171}', int64 = "double")
## $big_int
## [1] 3.534024e+18
simdjson_parse(
  '{"big_ints":[{"a":1178007955838509057,"b":2356015911677018114,"c":[2356015911677018114,4712031823354036228]}]}',
  json_pointer = "big_ints/0/c/1"
)
## integer64
## [1] 4712031823354036228

Benchmarking

tweet_json <- readr::read_lines("../tweetio/inst/example-data/ufc-tweet-stream.json")
test_json <- tweet_json[vapply(tweet_json, jsonlite::validate, logical(1L))]

length(test_json)
## [1] 100000
library(jsonlite)
# library(jsonify, warn.conflicts = FALSE)

bench::mark(
  simdjson = simdjson <- simdjson_parse(test_json),
  fairer_simdjson = fairer_simdjson <- lapply(test_json, simdjson_parse)
  # jsonify = jsonify <- lapply(test_json, from_json, simplify = FALSE)  # sefgaults when knitting...?
  ,
  jsonlite = jsonlite <- lapply(test_json, parse_json)
  ,
  check = FALSE
)
## Warning: Some expressions had a GC in every iteration; so filtering is disabled.

## # A tibble: 3 x 6
##   expression           min   median `itr/sec` mem_alloc `gc/sec`
##   <bch:expr>      <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
## 1 simdjson           6.85s    6.85s    0.146      243MB   0.146 
## 2 fairer_simdjson   11.02s   11.02s    0.0907     474MB   0.0907
## 3 jsonlite          41.89s   41.89s    0.0239     234MB   0.0239

Comparing Output

simdjson[[200]]$entities$user_mentions[[1]][c("id", "id_str", "indices")]
## $id
## integer64
## [1] 3230043854
## 
## $id_str
## [1] "3230043854"
## 
## $indices
## $indices[[1]]
## [1] 3
## 
## $indices[[2]]
## [1] 14
# jsonify[[200]]$entities$user_mentions[[1]][c("id", "id_str", "indices")]
jsonlite[[200]]$entities$user_mentions[[1]][c("id", "id_str", "indices")]
## $id
## [1] 3230043854
## 
## $id_str
## [1] "3230043854"
## 
## $indices
## $indices[[1]]
## [1] 3
## 
## $indices[[2]]
## [1] 14

Some More Checks…

json_example <- test_json[[200]]

simdjson_parse(json_example, json_pointer = "entities/user_mentions/0/id")
## integer64
## [1] 3230043854
simdjson_parse(json_example, json_pointer = "entities/user_mentions/0/id", int64 = "string")
## [1] "3230043854"
simdjson_parse(json_example, json_pointer = "entities/user_mentions/0/id_str")
## [1] "3230043854"
simdjson_parse(json_example)
## $created_at
## [1] "Sun Nov 03 04:36:42 +0000 2019"
## 
## $id
## integer64
## [1] 1190850263894151168
## 
## $id_str
## [1] "1190850263894151168"
## 
## $text
## [1] "RT @LordBalvin: How to open a fight lmfao #UFC244 https://t.co/kL2gLu6yGl"
## 
## $source
## [1] "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>"
## 
## $truncated
## [1] FALSE
## 
## $in_reply_to_status_id
## NULL
## 
## $in_reply_to_status_id_str
## NULL
## 
## $in_reply_to_user_id
## NULL
## 
## $in_reply_to_user_id_str
## NULL
## 
## $in_reply_to_screen_name
## NULL
## 
## $user
## $user$id
## [1] 265121424
## 
## $user$id_str
## [1] "265121424"
## 
## $user$name
## [1] "AJ The Juiceman"
## 
## $user$screen_name
## [1] "xPhenomenal1"
## 
## $user$location
## [1] "Grove Street "
## 
## $user$url
## [1] "http://www.youtube.com/user/402Phenomenal402?feature=mhee"
## 
## $user$description
## [1] "Sneakerhead,fan of @CMPunk and often confused with Tim Duncan and Drake, Straight edge Nigga #PMA daily, Lovable Asshole, sarcastic prick to some"
## 
## $user$translator_type
## [1] "none"
## 
## $user$protected
## [1] FALSE
## 
## $user$verified
## [1] FALSE
## 
## $user$followers_count
## [1] 1258
## 
## $user$friends_count
## [1] 483
## 
## $user$listed_count
## [1] 36
## 
## $user$favourites_count
## [1] 4588
## 
## $user$statuses_count
## [1] 101319
## 
## $user$created_at
## [1] "Sun Mar 13 02:01:24 +0000 2011"
## 
## $user$utc_offset
## NULL
## 
## $user$time_zone
## NULL
## 
## $user$geo_enabled
## [1] TRUE
## 
## $user$lang
## NULL
## 
## $user$contributors_enabled
## [1] FALSE
## 
## $user$is_translator
## [1] FALSE
## 
## $user$profile_background_color
## [1] "E627E6"
## 
## $user$profile_background_image_url
## [1] "http://abs.twimg.com/images/themes/theme1/bg.png"
## 
## $user$profile_background_image_url_https
## [1] "https://abs.twimg.com/images/themes/theme1/bg.png"
## 
## $user$profile_background_tile
## [1] FALSE
## 
## $user$profile_link_color
## [1] "3B94D9"
## 
## $user$profile_sidebar_border_color
## [1] "000000"
## 
## $user$profile_sidebar_fill_color
## [1] "0A5C16"
## 
## $user$profile_text_color
## [1] "030303"
## 
## $user$profile_use_background_image
## [1] TRUE
## 
## $user$profile_image_url
## [1] "http://pbs.twimg.com/profile_images/1021894061131751424/CPyJZEcT_normal.jpg"
## 
## $user$profile_image_url_https
## [1] "https://pbs.twimg.com/profile_images/1021894061131751424/CPyJZEcT_normal.jpg"
## 
## $user$profile_banner_url
## [1] "https://pbs.twimg.com/profile_banners/265121424/1535413595"
## 
## $user$default_profile
## [1] FALSE
## 
## $user$default_profile_image
## [1] FALSE
## 
## $user$following
## NULL
## 
## $user$follow_request_sent
## NULL
## 
## $user$notifications
## NULL
## 
## 
## $geo
## NULL
## 
## $coordinates
## NULL
## 
## $place
## NULL
## 
## $contributors
## NULL
## 
## $retweeted_status
## $retweeted_status$created_at
## [1] "Sun Nov 03 04:33:09 +0000 2019"
## 
## $retweeted_status$id
## integer64
## [1] 1190849368494092288
## 
## $retweeted_status$id_str
## [1] "1190849368494092288"
## 
## $retweeted_status$text
## [1] "How to open a fight lmfao #UFC244 https://t.co/kL2gLu6yGl"
## 
## $retweeted_status$display_text_range
## $retweeted_status$display_text_range[[1]]
## [1] 0
## 
## $retweeted_status$display_text_range[[2]]
## [1] 33
## 
## 
## $retweeted_status$source
## [1] "<a href=\"https://about.twitter.com/products/tweetdeck\" rel=\"nofollow\">TweetDeck</a>"
## 
## $retweeted_status$truncated
## [1] FALSE
## 
## $retweeted_status$in_reply_to_status_id
## NULL
## 
## $retweeted_status$in_reply_to_status_id_str
## NULL
## 
## $retweeted_status$in_reply_to_user_id
## NULL
## 
## $retweeted_status$in_reply_to_user_id_str
## NULL
## 
## $retweeted_status$in_reply_to_screen_name
## NULL
## 
## $retweeted_status$user
## $retweeted_status$user$id
## integer64
## [1] 3230043854
## 
## $retweeted_status$user$id_str
## [1] "3230043854"
## 
## $retweeted_status$user$name
## [1] "Big Boss"
## 
## $retweeted_status$user$screen_name
## [1] "LordBalvin"
## 
## $retweeted_status$user$location
## [1] "Outer Heaven"
## 
## $retweeted_status$user$url
## [1] "http://twitch.tv/lordbalvin"
## 
## $retweeted_status$user$description
## [1] "Business contact: balvinsanity@gmail.com"
## 
## $retweeted_status$user$translator_type
## [1] "none"
## 
## $retweeted_status$user$protected
## [1] FALSE
## 
## $retweeted_status$user$verified
## [1] FALSE
## 
## $retweeted_status$user$followers_count
## [1] 11165
## 
## $retweeted_status$user$friends_count
## [1] 284
## 
## $retweeted_status$user$listed_count
## [1] 418
## 
## $retweeted_status$user$favourites_count
## [1] 271
## 
## $retweeted_status$user$statuses_count
## [1] 45110
## 
## $retweeted_status$user$created_at
## [1] "Fri May 29 19:21:29 +0000 2015"
## 
## $retweeted_status$user$utc_offset
## NULL
## 
## $retweeted_status$user$time_zone
## NULL
## 
## $retweeted_status$user$geo_enabled
## [1] TRUE
## 
## $retweeted_status$user$lang
## NULL
## 
## $retweeted_status$user$contributors_enabled
## [1] FALSE
## 
## $retweeted_status$user$is_translator
## [1] FALSE
## 
## $retweeted_status$user$profile_background_color
## [1] "000000"
## 
## $retweeted_status$user$profile_background_image_url
## [1] "http://abs.twimg.com/images/themes/theme1/bg.png"
## 
## $retweeted_status$user$profile_background_image_url_https
## [1] "https://abs.twimg.com/images/themes/theme1/bg.png"
## 
## $retweeted_status$user$profile_background_tile
## [1] FALSE
## 
## $retweeted_status$user$profile_link_color
## [1] "E81C4F"
## 
## $retweeted_status$user$profile_sidebar_border_color
## [1] "000000"
## 
## $retweeted_status$user$profile_sidebar_fill_color
## [1] "000000"
## 
## $retweeted_status$user$profile_text_color
## [1] "000000"
## 
## $retweeted_status$user$profile_use_background_image
## [1] FALSE
## 
## $retweeted_status$user$profile_image_url
## [1] "http://pbs.twimg.com/profile_images/1188286607310381057/rtZxtwGQ_normal.jpg"
## 
## $retweeted_status$user$profile_image_url_https
## [1] "https://pbs.twimg.com/profile_images/1188286607310381057/rtZxtwGQ_normal.jpg"
## 
## $retweeted_status$user$profile_banner_url
## [1] "https://pbs.twimg.com/profile_banners/3230043854/1571053396"
## 
## $retweeted_status$user$default_profile
## [1] FALSE
## 
## $retweeted_status$user$default_profile_image
## [1] FALSE
## 
## $retweeted_status$user$following
## NULL
## 
## $retweeted_status$user$follow_request_sent
## NULL
## 
## $retweeted_status$user$notifications
## NULL
## 
## 
## $retweeted_status$geo
## NULL
## 
## $retweeted_status$coordinates
## NULL
## 
## $retweeted_status$place
## NULL
## 
## $retweeted_status$contributors
## NULL
## 
## $retweeted_status$is_quote_status
## [1] FALSE
## 
## $retweeted_status$quote_count
## [1] 4
## 
## $retweeted_status$reply_count
## [1] 2
## 
## $retweeted_status$retweet_count
## [1] 42
## 
## $retweeted_status$favorite_count
## [1] 88
## 
## $retweeted_status$entities
## $retweeted_status$entities$hashtags
## $retweeted_status$entities$hashtags[[1]]
## $retweeted_status$entities$hashtags[[1]]$text
## [1] "UFC244"
## 
## $retweeted_status$entities$hashtags[[1]]$indices
## $retweeted_status$entities$hashtags[[1]]$indices[[1]]
## [1] 26
## 
## $retweeted_status$entities$hashtags[[1]]$indices[[2]]
## [1] 33
## 
## 
## 
## 
## $retweeted_status$entities$urls
## list()
## 
## $retweeted_status$entities$user_mentions
## list()
## 
## $retweeted_status$entities$symbols
## list()
## 
## $retweeted_status$entities$media
## $retweeted_status$entities$media[[1]]
## $retweeted_status$entities$media[[1]]$id
## integer64
## [1] 1190849300806455298
## 
## $retweeted_status$entities$media[[1]]$id_str
## [1] "1190849300806455298"
## 
## $retweeted_status$entities$media[[1]]$indices
## $retweeted_status$entities$media[[1]]$indices[[1]]
## [1] 34
## 
## $retweeted_status$entities$media[[1]]$indices[[2]]
## [1] 57
## 
## 
## $retweeted_status$entities$media[[1]]$media_url
## [1] "http://pbs.twimg.com/tweet_video_thumb/EIa_ITOXUAIqVsL.jpg"
## 
## $retweeted_status$entities$media[[1]]$media_url_https
## [1] "https://pbs.twimg.com/tweet_video_thumb/EIa_ITOXUAIqVsL.jpg"
## 
## $retweeted_status$entities$media[[1]]$url
## [1] "https://t.co/kL2gLu6yGl"
## 
## $retweeted_status$entities$media[[1]]$display_url
## [1] "pic.twitter.com/kL2gLu6yGl"
## 
## $retweeted_status$entities$media[[1]]$expanded_url
## [1] "https://twitter.com/LordBalvin/status/1190849368494092288/photo/1"
## 
## $retweeted_status$entities$media[[1]]$type
## [1] "photo"
## 
## $retweeted_status$entities$media[[1]]$sizes
## $retweeted_status$entities$media[[1]]$sizes$thumb
## $retweeted_status$entities$media[[1]]$sizes$thumb$w
## [1] 150
## 
## $retweeted_status$entities$media[[1]]$sizes$thumb$h
## [1] 150
## 
## $retweeted_status$entities$media[[1]]$sizes$thumb$resize
## [1] "crop"
## 
## 
## $retweeted_status$entities$media[[1]]$sizes$small
## $retweeted_status$entities$media[[1]]$sizes$small$w
## [1] 660
## 
## $retweeted_status$entities$media[[1]]$sizes$small$h
## [1] 362
## 
## $retweeted_status$entities$media[[1]]$sizes$small$resize
## [1] "fit"
## 
## 
## $retweeted_status$entities$media[[1]]$sizes$large
## $retweeted_status$entities$media[[1]]$sizes$large$w
## [1] 660
## 
## $retweeted_status$entities$media[[1]]$sizes$large$h
## [1] 362
## 
## $retweeted_status$entities$media[[1]]$sizes$large$resize
## [1] "fit"
## 
## 
## $retweeted_status$entities$media[[1]]$sizes$medium
## $retweeted_status$entities$media[[1]]$sizes$medium$w
## [1] 660
## 
## $retweeted_status$entities$media[[1]]$sizes$medium$h
## [1] 362
## 
## $retweeted_status$entities$media[[1]]$sizes$medium$resize
## [1] "fit"
## 
## 
## 
## 
## 
## 
## $retweeted_status$extended_entities
## $retweeted_status$extended_entities$media
## $retweeted_status$extended_entities$media[[1]]
## $retweeted_status$extended_entities$media[[1]]$id
## integer64
## [1] 1190849300806455298
## 
## $retweeted_status$extended_entities$media[[1]]$id_str
## [1] "1190849300806455298"
## 
## $retweeted_status$extended_entities$media[[1]]$indices
## $retweeted_status$extended_entities$media[[1]]$indices[[1]]
## [1] 34
## 
## $retweeted_status$extended_entities$media[[1]]$indices[[2]]
## [1] 57
## 
## 
## $retweeted_status$extended_entities$media[[1]]$media_url
## [1] "http://pbs.twimg.com/tweet_video_thumb/EIa_ITOXUAIqVsL.jpg"
## 
## $retweeted_status$extended_entities$media[[1]]$media_url_https
## [1] "https://pbs.twimg.com/tweet_video_thumb/EIa_ITOXUAIqVsL.jpg"
## 
## $retweeted_status$extended_entities$media[[1]]$url
## [1] "https://t.co/kL2gLu6yGl"
## 
## $retweeted_status$extended_entities$media[[1]]$display_url
## [1] "pic.twitter.com/kL2gLu6yGl"
## 
## $retweeted_status$extended_entities$media[[1]]$expanded_url
## [1] "https://twitter.com/LordBalvin/status/1190849368494092288/photo/1"
## 
## $retweeted_status$extended_entities$media[[1]]$type
## [1] "animated_gif"
## 
## $retweeted_status$extended_entities$media[[1]]$video_info
## $retweeted_status$extended_entities$media[[1]]$video_info$aspect_ratio
## $retweeted_status$extended_entities$media[[1]]$video_info$aspect_ratio[[1]]
## [1] 330
## 
## $retweeted_status$extended_entities$media[[1]]$video_info$aspect_ratio[[2]]
## [1] 181
## 
## 
## $retweeted_status$extended_entities$media[[1]]$video_info$variants
## $retweeted_status$extended_entities$media[[1]]$video_info$variants[[1]]
## $retweeted_status$extended_entities$media[[1]]$video_info$variants[[1]]$bitrate
## [1] 0
## 
## $retweeted_status$extended_entities$media[[1]]$video_info$variants[[1]]$content_type
## [1] "video/mp4"
## 
## $retweeted_status$extended_entities$media[[1]]$video_info$variants[[1]]$url
## [1] "https://video.twimg.com/tweet_video/EIa_ITOXUAIqVsL.mp4"
## 
## 
## 
## 
## $retweeted_status$extended_entities$media[[1]]$sizes
## $retweeted_status$extended_entities$media[[1]]$sizes$thumb
## $retweeted_status$extended_entities$media[[1]]$sizes$thumb$w
## [1] 150
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$thumb$h
## [1] 150
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$thumb$resize
## [1] "crop"
## 
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$small
## $retweeted_status$extended_entities$media[[1]]$sizes$small$w
## [1] 660
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$small$h
## [1] 362
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$small$resize
## [1] "fit"
## 
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$large
## $retweeted_status$extended_entities$media[[1]]$sizes$large$w
## [1] 660
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$large$h
## [1] 362
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$large$resize
## [1] "fit"
## 
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$medium
## $retweeted_status$extended_entities$media[[1]]$sizes$medium$w
## [1] 660
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$medium$h
## [1] 362
## 
## $retweeted_status$extended_entities$media[[1]]$sizes$medium$resize
## [1] "fit"
## 
## 
## 
## 
## 
## 
## $retweeted_status$favorited
## [1] FALSE
## 
## $retweeted_status$retweeted
## [1] FALSE
## 
## $retweeted_status$possibly_sensitive
## [1] FALSE
## 
## $retweeted_status$filter_level
## [1] "low"
## 
## $retweeted_status$lang
## [1] "en"
## 
## 
## $is_quote_status
## [1] FALSE
## 
## $quote_count
## [1] 0
## 
## $reply_count
## [1] 0
## 
## $retweet_count
## [1] 0
## 
## $favorite_count
## [1] 0
## 
## $entities
## $entities$hashtags
## $entities$hashtags[[1]]
## $entities$hashtags[[1]]$text
## [1] "UFC244"
## 
## $entities$hashtags[[1]]$indices
## $entities$hashtags[[1]]$indices[[1]]
## [1] 42
## 
## $entities$hashtags[[1]]$indices[[2]]
## [1] 49
## 
## 
## 
## 
## $entities$urls
## list()
## 
## $entities$user_mentions
## $entities$user_mentions[[1]]
## $entities$user_mentions[[1]]$screen_name
## [1] "LordBalvin"
## 
## $entities$user_mentions[[1]]$name
## [1] "Big Boss"
## 
## $entities$user_mentions[[1]]$id
## integer64
## [1] 3230043854
## 
## $entities$user_mentions[[1]]$id_str
## [1] "3230043854"
## 
## $entities$user_mentions[[1]]$indices
## $entities$user_mentions[[1]]$indices[[1]]
## [1] 3
## 
## $entities$user_mentions[[1]]$indices[[2]]
## [1] 14
## 
## 
## 
## 
## $entities$symbols
## list()
## 
## $entities$media
## $entities$media[[1]]
## $entities$media[[1]]$id
## integer64
## [1] 1190849300806455298
## 
## $entities$media[[1]]$id_str
## [1] "1190849300806455298"
## 
## $entities$media[[1]]$indices
## $entities$media[[1]]$indices[[1]]
## [1] 50
## 
## $entities$media[[1]]$indices[[2]]
## [1] 73
## 
## 
## $entities$media[[1]]$media_url
## [1] "http://pbs.twimg.com/tweet_video_thumb/EIa_ITOXUAIqVsL.jpg"
## 
## $entities$media[[1]]$media_url_https
## [1] "https://pbs.twimg.com/tweet_video_thumb/EIa_ITOXUAIqVsL.jpg"
## 
## $entities$media[[1]]$url
## [1] "https://t.co/kL2gLu6yGl"
## 
## $entities$media[[1]]$display_url
## [1] "pic.twitter.com/kL2gLu6yGl"
## 
## $entities$media[[1]]$expanded_url
## [1] "https://twitter.com/LordBalvin/status/1190849368494092288/photo/1"
## 
## $entities$media[[1]]$type
## [1] "photo"
## 
## $entities$media[[1]]$sizes
## $entities$media[[1]]$sizes$thumb
## $entities$media[[1]]$sizes$thumb$w
## [1] 150
## 
## $entities$media[[1]]$sizes$thumb$h
## [1] 150
## 
## $entities$media[[1]]$sizes$thumb$resize
## [1] "crop"
## 
## 
## $entities$media[[1]]$sizes$small
## $entities$media[[1]]$sizes$small$w
## [1] 660
## 
## $entities$media[[1]]$sizes$small$h
## [1] 362
## 
## $entities$media[[1]]$sizes$small$resize
## [1] "fit"
## 
## 
## $entities$media[[1]]$sizes$large
## $entities$media[[1]]$sizes$large$w
## [1] 660
## 
## $entities$media[[1]]$sizes$large$h
## [1] 362
## 
## $entities$media[[1]]$sizes$large$resize
## [1] "fit"
## 
## 
## $entities$media[[1]]$sizes$medium
## $entities$media[[1]]$sizes$medium$w
## [1] 660
## 
## $entities$media[[1]]$sizes$medium$h
## [1] 362
## 
## $entities$media[[1]]$sizes$medium$resize
## [1] "fit"
## 
## 
## 
## $entities$media[[1]]$source_status_id
## integer64
## [1] 1190849368494092288
## 
## $entities$media[[1]]$source_status_id_str
## [1] "1190849368494092288"
## 
## $entities$media[[1]]$source_user_id
## integer64
## [1] 3230043854
## 
## $entities$media[[1]]$source_user_id_str
## [1] "3230043854"
## 
## 
## 
## 
## $extended_entities
## $extended_entities$media
## $extended_entities$media[[1]]
## $extended_entities$media[[1]]$id
## integer64
## [1] 1190849300806455298
## 
## $extended_entities$media[[1]]$id_str
## [1] "1190849300806455298"
## 
## $extended_entities$media[[1]]$indices
## $extended_entities$media[[1]]$indices[[1]]
## [1] 50
## 
## $extended_entities$media[[1]]$indices[[2]]
## [1] 73
## 
## 
## $extended_entities$media[[1]]$media_url
## [1] "http://pbs.twimg.com/tweet_video_thumb/EIa_ITOXUAIqVsL.jpg"
## 
## $extended_entities$media[[1]]$media_url_https
## [1] "https://pbs.twimg.com/tweet_video_thumb/EIa_ITOXUAIqVsL.jpg"
## 
## $extended_entities$media[[1]]$url
## [1] "https://t.co/kL2gLu6yGl"
## 
## $extended_entities$media[[1]]$display_url
## [1] "pic.twitter.com/kL2gLu6yGl"
## 
## $extended_entities$media[[1]]$expanded_url
## [1] "https://twitter.com/LordBalvin/status/1190849368494092288/photo/1"
## 
## $extended_entities$media[[1]]$type
## [1] "animated_gif"
## 
## $extended_entities$media[[1]]$video_info
## $extended_entities$media[[1]]$video_info$aspect_ratio
## $extended_entities$media[[1]]$video_info$aspect_ratio[[1]]
## [1] 330
## 
## $extended_entities$media[[1]]$video_info$aspect_ratio[[2]]
## [1] 181
## 
## 
## $extended_entities$media[[1]]$video_info$variants
## $extended_entities$media[[1]]$video_info$variants[[1]]
## $extended_entities$media[[1]]$video_info$variants[[1]]$bitrate
## [1] 0
## 
## $extended_entities$media[[1]]$video_info$variants[[1]]$content_type
## [1] "video/mp4"
## 
## $extended_entities$media[[1]]$video_info$variants[[1]]$url
## [1] "https://video.twimg.com/tweet_video/EIa_ITOXUAIqVsL.mp4"
## 
## 
## 
## 
## $extended_entities$media[[1]]$sizes
## $extended_entities$media[[1]]$sizes$thumb
## $extended_entities$media[[1]]$sizes$thumb$w
## [1] 150
## 
## $extended_entities$media[[1]]$sizes$thumb$h
## [1] 150
## 
## $extended_entities$media[[1]]$sizes$thumb$resize
## [1] "crop"
## 
## 
## $extended_entities$media[[1]]$sizes$small
## $extended_entities$media[[1]]$sizes$small$w
## [1] 660
## 
## $extended_entities$media[[1]]$sizes$small$h
## [1] 362
## 
## $extended_entities$media[[1]]$sizes$small$resize
## [1] "fit"
## 
## 
## $extended_entities$media[[1]]$sizes$large
## $extended_entities$media[[1]]$sizes$large$w
## [1] 660
## 
## $extended_entities$media[[1]]$sizes$large$h
## [1] 362
## 
## $extended_entities$media[[1]]$sizes$large$resize
## [1] "fit"
## 
## 
## $extended_entities$media[[1]]$sizes$medium
## $extended_entities$media[[1]]$sizes$medium$w
## [1] 660
## 
## $extended_entities$media[[1]]$sizes$medium$h
## [1] 362
## 
## $extended_entities$media[[1]]$sizes$medium$resize
## [1] "fit"
## 
## 
## 
## $extended_entities$media[[1]]$source_status_id
## integer64
## [1] 1190849368494092288
## 
## $extended_entities$media[[1]]$source_status_id_str
## [1] "1190849368494092288"
## 
## $extended_entities$media[[1]]$source_user_id
## integer64
## [1] 3230043854
## 
## $extended_entities$media[[1]]$source_user_id_str
## [1] "3230043854"
## 
## 
## 
## 
## $favorited
## [1] FALSE
## 
## $retweeted
## [1] FALSE
## 
## $possibly_sensitive
## [1] TRUE
## 
## $filter_level
## [1] "low"
## 
## $lang
## [1] "en"
## 
## $timestamp_ms
## [1] "1572755802497"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment