为什么在函数中使用tidycensus get_decennial()会失败?

时间:2018-06-25 22:06:21

标签: r tidycensus

对于为什么会发生此错误,我感到很困惑。我正在尝试编写一个将字符串从get_decennial()包传递到tidycensus的函数,但是会引发错误。

我能够在功能范围之外成功运行相同的代码。我似乎无法理解为什么将输入传递给函数会使其失败。特别是,由于我成功地将一个对象传递给了county参数的函数(如下所示)。有没有其他人遇到过这样的事情?我认为以下示例说明了该问题。我尝试从上次调用中复制输出/错误,但是对于低质量的格式化我深表歉意。

library(tidycensus)
library(dplyr)
census_api_key(Sys.getenv("CENSUS_API_KEY")) # put your census api key here

oregon <- filter(fips_codes, state_name == "Oregon")
oregon_counties <- oregon$county_code  

# this works
why_does_this_work <- "Oregon"

get_decennial(geography = "block group", 
                state = why_does_this_work, 
                variables = "H00010001",
                county = oregon_counties,
                quiet = TRUE)


# why doesn't this work
why_doesnt_this_work <- function(x) {

  get_decennial(geography = "block group", 
                state = x, 
                variables = "H00010001",
                county = oregon_counties,
                quiet = TRUE)
 }

why_doesnt_this_work("Oregon")

Getting data from the 2010 decennial Census

Getting data from the 2010 decennial Census
Getting data from the 2010 decennial Census
Error : Result 1 is not a length 1 atomic vector
In addition: Warning messages:
1: '03' is not a valid FIPS code or state name/abbreviation
2: '03' is not a valid FIPS code or state name/abbreviation

 “显示回溯

使用调试重新运行  collect_(data,key_col = compat_as_lazy(enquo(key)),error_col = compat_as_lazy(enquo(value))中的错误:   未使用的参数(-NAME)”

1 个答案:

答案 0 :(得分:4)

由于R如何评估环境层次结构中的对象。 换句话说,在get_decennial()函数的代码中已经有一个名为“ x”的元素。您的自定义函数why_doesnt_this_work()与get_decennial()处于同一级别。因此,对于get_decennial管道,至少要使用两个元素/对象的相同值,这会破坏事物。

要解决此问题,只需将自定义x重命名为get_decennial期望的状态,即“状态”。

why_doesnt_this_work <- function(state) {

  get_decennial(geography = "block group", 
            state = as.character(state), 
            variables = "H00010001",
            county = oregon_counties,
            quiet = TRUE)
  }
why_doesnt_this_work('Oregon') ## Now it works!