{"id":6700,"date":"2022-09-11T18:35:59","date_gmt":"2022-09-11T18:35:59","guid":{"rendered":"https:\/\/www.garysieling.com\/blog\/?p=6700"},"modified":"2022-09-11T18:37:02","modified_gmt":"2022-09-11T18:37:02","slug":"a-simple-implementation-of-data-shadowing-in-r","status":"publish","type":"post","link":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/","title":{"rendered":"A simple implementation of data shadowing in R"},"content":{"rendered":"\n<p>Idiomatic R often uses a neat syntactic sugar called shadowing.<\/p>\n\n\n\n<p>Imagine you have a dataframe (df) containing the costs of summer camps:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Child<\/td><td>Week<\/td><td>Cost<\/td><\/tr><tr><td>1<\/td><td>1<\/td><td>$60<\/td><\/tr><tr><td>1<\/td><td>2<\/td><td>$200<\/td><\/tr><tr><td>2<\/td><td>1<\/td><td>$400<\/td><\/tr><tr><td>2<\/td><td>2<\/td><td>$275<\/td><\/tr><tr><td>2<\/td><td>2<\/td><td>$1000<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>A common access pattern is to filter the data frame using the column names. Note however that we pass an expression &#8211; not a lambda, as we would in other languages:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df&#91;Week == 1]<\/code><\/pre>\n\n\n\n<p>To learn why this works, we can implement a crude version of a filtering function ourselves.<\/p>\n\n\n\n<p>First, let&#8217;s define a function that takes a dataframe and an expression:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>simple_filter &lt;- function(df, e) {\n  print(enexpr(e))\n}<\/code><\/pre>\n\n\n\n<p>If you call this as &#8220;filter(df, Week ==     1)&#8221;, it will print out:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code data-enlighter-language=\"r\" class=\"EnlighterJSRAW\">Week == 1<\/code><\/code><\/pre>\n\n\n\n<p>This output is the .toString equivalent for the abstract syntax tree of the expression provided in <code>e<\/code>. <\/p>\n\n\n\n<p>Note that if we replace <code>print(enexpr(e))<\/code> with <code>print(e)<\/code>, we&#8217;ll get an error:<\/p>\n\n\n\n<p><code>Error in print(e) : object 'Week' not found<\/code><\/p>\n\n\n\n<p>There is no variable named &#8216;a&#8217; in scope in the environment. We only get this error when the expression is used, as the arguments are promises that represent the result of the expression passed in, and are lazily evaluated.<\/p>\n\n\n\n<p>The difference between the expression <code>Week == <\/code>1 and the lambda <code>(Week) => Week == 1<\/code> is that in a lambda, context is provided. Context includes both arguments and variables the lambda closes over. These form the &#8220;environment&#8221; in which the function runs.<\/p>\n\n\n\n<p>To complete our <code>filter<\/code> implementation, we need to build an environment in which to evaluate the variables:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code data-enlighter-language=\"r\" class=\"EnlighterJSRAW\">env &lt;- new.env()<\/code><\/code><\/pre>\n\n\n\n<p>Then all we need to do is to loop over the rows in the dataframe, populating the variables as we look at each row. The <code>assign<\/code> function inserts a value into the environment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cols &lt;- colnames(df)\nfor(i in 1:nrow(df)) { \n  for(j in 1:ncol(df)) {\n    col &lt;- cols&#91;j]\n    assign(col, df&#91;i, j], env)\n  }\n\n  ...\n}<\/code><\/pre>\n\n\n\n<p>For our final step, we can put this all together into a function which prints out rows that match our expression. This adds a call to <code>eval<\/code>, which evaluates the given expression in the context of the environment we&#8217;ve built from the row:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>simple_filter &lt;- function(df, e) {\n  query &lt;- enexpr(e)\n  cols &lt;- colnames(df)\n  env &lt;- new.env()\n  for(i in 1:nrow(df)) { \n    for(j in 1:ncol(df)) {\n      col &lt;- cols&#91;j]\n      assign(col, df&#91;i, j], env)\n    }\n\n    if(eval(query, envir = env)) {\n      print(df&#91;i, ])\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>And there you have it!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Idiomatic R often uses a neat syntactic sugar called shadowing. Imagine you have a dataframe (df) containing the costs of summer camps: Child Week Cost 1 1 $60 1 2 $200 2 1 $400 2 2 $275 2 2 $1000 A common access pattern is to filter the data frame using the column names. Note &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;A simple implementation of data shadowing in R&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[4,6],"tags":[152,244,441,450],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"Idiomatic R often uses a neat syntactic sugar called shadowing. Imagine you have a dataframe (df) containing the costs of summer camps: A common access pattern is to filter the data frame using the column names. Note however that we pass an expression - not a lambda, as we would in other languages: df[Week ==\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"gary\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Gary Sieling - Software Engineer\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"A simple implementation of data shadowing in R - Gary Sieling\" \/>\n\t\t<meta property=\"og:description\" content=\"Idiomatic R often uses a neat syntactic sugar called shadowing. Imagine you have a dataframe (df) containing the costs of summer camps: A common access pattern is to filter the data frame using the column names. Note however that we pass an expression - not a lambda, as we would in other languages: df[Week ==\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2022-09-11T18:35:59+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2022-09-11T18:37:02+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"A simple implementation of data shadowing in R - Gary Sieling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Idiomatic R often uses a neat syntactic sugar called shadowing. Imagine you have a dataframe (df) containing the costs of summer camps: A common access pattern is to filter the data frame using the column names. Note however that we pass an expression - not a lambda, as we would in other languages: df[Week ==\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/#blogposting\",\"name\":\"A simple implementation of data shadowing in R - Gary Sieling\",\"headline\":\"A simple implementation of data shadowing in R\",\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"},\"datePublished\":\"2022-09-11T18:35:59+00:00\",\"dateModified\":\"2022-09-11T18:37:02+00:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/#webpage\"},\"articleSection\":\"Code Examples, Data Science, data science, functional programming, programming-languages, R\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"name\":\"Code Examples\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"position\":2,\"name\":\"Code Examples\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/#listItem\",\"name\":\"A simple implementation of data shadowing in R\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/#listItem\",\"position\":3,\"name\":\"A simple implementation of data shadowing in R\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"name\":\"Code Examples\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/\",\"name\":\"gary\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"gary\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/#webpage\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/\",\"name\":\"A simple implementation of data shadowing in R - Gary Sieling\",\"description\":\"Idiomatic R often uses a neat syntactic sugar called shadowing. Imagine you have a dataframe (df) containing the costs of summer camps: A common access pattern is to filter the data frame using the column names. Note however that we pass an expression - not a lambda, as we would in other languages: df[Week ==\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/a-simple-implementation-of-data-shadowing-in-r\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"datePublished\":\"2022-09-11T18:35:59+00:00\",\"dateModified\":\"2022-09-11T18:37:02+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"A simple implementation of data shadowing in R - Gary Sieling","description":"Idiomatic R often uses a neat syntactic sugar called shadowing. Imagine you have a dataframe (df) containing the costs of summer camps: A common access pattern is to filter the data frame using the column names. Note however that we pass an expression - not a lambda, as we would in other languages: df[Week ==","canonical_url":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/#blogposting","name":"A simple implementation of data shadowing in R - Gary Sieling","headline":"A simple implementation of data shadowing in R","author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"},"datePublished":"2022-09-11T18:35:59+00:00","dateModified":"2022-09-11T18:37:02+00:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/#webpage"},"isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/#webpage"},"articleSection":"Code Examples, Data Science, data science, functional programming, programming-languages, R"},{"@type":"BreadcrumbList","@id":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.garysieling.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","name":"Code Examples"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","position":2,"name":"Code Examples","item":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/#listItem","name":"A simple implementation of data shadowing in R"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/#listItem","position":3,"name":"A simple implementation of data shadowing in R","previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","name":"Code Examples"}}]},{"@type":"Organization","@id":"https:\/\/www.garysieling.com\/blog\/#organization","name":"Gary Sieling","description":"Software Engineer","url":"https:\/\/www.garysieling.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author","url":"https:\/\/www.garysieling.com\/blog\/author\/gary\/","name":"gary","image":{"@type":"ImageObject","@id":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g","width":96,"height":96,"caption":"gary"}},{"@type":"WebPage","@id":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/#webpage","url":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/","name":"A simple implementation of data shadowing in R - Gary Sieling","description":"Idiomatic R often uses a neat syntactic sugar called shadowing. Imagine you have a dataframe (df) containing the costs of summer camps: A common access pattern is to filter the data frame using the column names. Note however that we pass an expression - not a lambda, as we would in other languages: df[Week ==","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/#breadcrumblist"},"author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"creator":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"datePublished":"2022-09-11T18:35:59+00:00","dateModified":"2022-09-11T18:37:02+00:00"},{"@type":"WebSite","@id":"https:\/\/www.garysieling.com\/blog\/#website","url":"https:\/\/www.garysieling.com\/blog\/","name":"Gary Sieling","description":"Software Engineer","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Gary Sieling - Software Engineer","og:type":"article","og:title":"A simple implementation of data shadowing in R - Gary Sieling","og:description":"Idiomatic R often uses a neat syntactic sugar called shadowing. Imagine you have a dataframe (df) containing the costs of summer camps: A common access pattern is to filter the data frame using the column names. Note however that we pass an expression - not a lambda, as we would in other languages: df[Week ==","og:url":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/","article:published_time":"2022-09-11T18:35:59+00:00","article:modified_time":"2022-09-11T18:37:02+00:00","twitter:card":"summary_large_image","twitter:title":"A simple implementation of data shadowing in R - Gary Sieling","twitter:description":"Idiomatic R often uses a neat syntactic sugar called shadowing. Imagine you have a dataframe (df) containing the costs of summer camps: A common access pattern is to filter the data frame using the column names. Note however that we pass an expression - not a lambda, as we would in other languages: df[Week =="},"aioseo_meta_data":{"post_id":"6700","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2023-02-04 16:02:28","updated":"2026-07-06 02:37:51","ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/\" title=\"Code Examples\">Code Examples<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tA simple implementation of data shadowing in R\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.garysieling.com\/blog"},{"label":"Code Examples","link":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/"},{"label":"A simple implementation of data shadowing in R","link":"https:\/\/www.garysieling.com\/blog\/a-simple-implementation-of-data-shadowing-in-r\/"}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/6700"}],"collection":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/comments?post=6700"}],"version-history":[{"count":3,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/6700\/revisions"}],"predecessor-version":[{"id":6703,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/6700\/revisions\/6703"}],"wp:attachment":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/media?parent=6700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/categories?post=6700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/tags?post=6700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}