0

I wrote a loop to download files from a public ftp server using the function get_pnadc like:

for (i in 2012:2013){
  for (a in 1:4){
    get_pnadc(year=i, quarter=a,  vars=c("VD4001","VD4002"),
                                 labels=TRUE, deflator=TRUE, design=FALSE,
                                   savedir = 'Microdados/')        
  }
}

I would like to have one object for each quarter/year also in my Global Environment. Is this possible to add such a command in my loop?

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
ph_9933
  • 97
  • 8
  • 5
    Avoid saving separate similarly structured objects. Instead, use a list of objects which will be a single item to manage in global environment. From this [canonical answer](https://stackoverflow.com/a/24376207/1422451): *Don't ever create `d1` `d2` `d3`, ..., `dn` in the first place. Create a list `d` with `n` elements.* – Parfait Nov 10 '21 at 17:52
  • 2
    Something like `pnad_list = list()` before the loop and `pnad_list[[paste0("y", i, "q", a)]] = get_pnadc(...)` inside the loop. – Gregor Thomas Nov 10 '21 at 17:58

1 Answers1

1

As mentioned, consider saving a list of objects which you can do so by generalizing your retrieval and build a list of names with expand.grid, Map (wrapper to mapply), and paste0.

proc_data <- function(i, a)
  get_pnadc(
     year=i, quarter=a, vars=c("VD4001","VD4002"),
     labels=TRUE, deflator=TRUE, design=FALSE,
     savedir = 'Microdados/'
  )
)
# CREATE DATA FRAME OF INPUT PARAMS
params_df <- expand.grid(quarter = 1:4, year = 2012:2013)

# ITERATIVELY CALL proc_data
obj_list <- Map(proc_data, params_df$year, params_df$quarter)

# NAME ELEMENTS
nms <- paste0("YR_", params_df$year, "_Q", params_df$quarter)
obj_list <- setNames(obj_list, nm)

# OUTPUT
obj_list$YR_2012_Q1
obj_list$YR_2012_Q2
...
Parfait
  • 104,375
  • 17
  • 94
  • 125