The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Working with config files

Assume we are exploring some data set, and during our work, we’ve created a number of files with their specific structure.

library(path.chain)
library(magrittr)

# Create an example file stucture
tmp <- create_temp_dir("files")
create_sample_dir(tmp, override = TRUE)
#> [1] TRUE

# Sample structure we've already created looks as follows
fs::dir_tree(tmp)
#> C:\Users\KRZYSZ~1.JOA\AppData\Local\Temp\RtmpExfx33/files
#> ├── data
#> │   ├── example1.RData
#> │   ├── example2.RData
#> │   └── persons.csv
#> └── docs
#>     └── schema.txt

Then, we have two possible ways to represent this structure using path.chain package.

1. Using full_path_chain function, which returns a list of nested directories.

tmp <- create_temp_dir("files")
full.path.chain <- full_path_chain(tmp)

print(full.path.chain)
#> $.
#> [1] "C:\\Users\\KRZYSZ~1.JOA\\AppData\\Local\\Temp\\RtmpExfx33/files"
#> 
#> $data
#> $data$.
#> [1] "C:\\Users\\KRZYSZ~1.JOA\\AppData\\Local\\Temp\\RtmpExfx33/files/data"
#> 
#> $data$example1.RData
#> [1] "C:\\Users\\KRZYSZ~1.JOA\\AppData\\Local\\Temp\\RtmpExfx33/files/data/example1.RData"
#> 
#> $data$example2.RData
#> [1] "C:\\Users\\KRZYSZ~1.JOA\\AppData\\Local\\Temp\\RtmpExfx33/files/data/example2.RData"
#> 
#> $data$persons.csv
#> [1] "C:\\Users\\KRZYSZ~1.JOA\\AppData\\Local\\Temp\\RtmpExfx33/files/data/persons.csv"
#> 
#> 
#> $docs
#> $docs$.
#> [1] "C:\\Users\\KRZYSZ~1.JOA\\AppData\\Local\\Temp\\RtmpExfx33/files/docs"
#> 
#> $docs$schema.txt
#> [1] "C:\\Users\\KRZYSZ~1.JOA\\AppData\\Local\\Temp\\RtmpExfx33/files/docs/schema.txt"

full.path.chain %>% 
  yaml::write_yaml(temp_path("config.yaml"))

Configuration file config.yaml will look as follows:

'.': files
data:
  '.': files/data
  example1.RData: files/data/example1.RData
  example2.RData: files/data/example2.RData
  persons.csv: files/data/persons.csv
docs:
  '.': files/docs
  schema.txt: files/docs/schema.txt

We can customize keys naming convention using naming argument.


naming_fun <- function(x){
  paste0("k", tools::file_path_sans_ext(stringi::stri_trans_totitle(basename(x))))
}

full.path.chain.2 <- full_path_chain(temp_path("files"), "kRoot", naming_fun)

full.path.chain.2 %>% 
  yaml::write_yaml(temp_path("config.yaml"))
kRoot: files
kData:
  kRoot: files/data
  kExample1: files/data/example1.RData
  kExample2: files/data/example2.RData
  kPersons: files/data/persons.csv
kDocs:
  kRoot: files/docs
  kSchema: files/docs/schema.txt

If dir structure is not a only element in ou config file, we can wrap it with some additional list.

list(kDirs = full.path.chain.2) %>% 
  list(default = .) %>% 
  yaml::write_yaml(temp_path("config.yaml"))
default:
  kDirs:
    kRoot: files
    kData:
      kRoot: files/data
      kExample1: files/data/example1.RData
      kExample2: files/data/example2.RData
      kPersons: files/data/persons.csv
    kDocs:
      kRoot: files/docs
      kSchema: files/docs/schema.txt

Then, we can load such config file using {config} package:

k.dirs <- config::get("kDirs", config = "default", file = temp_path("config.yaml"))
k.dirs$kDocs$kRoot
#> [1] "C:\\Users\\KRZYSZ~1.JOA\\AppData\\Local\\Temp\\RtmpExfx33/files/docs"
k.dirs$kData$kExample1
#> [1] "C:\\Users\\KRZYSZ~1.JOA\\AppData\\Local\\Temp\\RtmpExfx33/files/data/example1.RData"

What if we want to keep absolute paths rather than the relative ones?

full_path_chain(normalizePath(temp_path("files")), "kRoot", naming_fun) %>% 
  as_config("default", "kDirs") %>% 
  yaml::write_yaml(temp_path("config.yaml"))

Wrapping with default key is required by config package.

default:
  kDirs:
    kRoot: /home/username/Desktop/myproject/files
    kData:
      kRoot: /home/username/Desktop/myproject/files/data
      kExample1: /home/username/Desktop/myproject/files/data/example1.RData
      kExample2: /home/username/Desktop/myproject/files/data/example2.RData
      kPersons: /home/username/Desktop/myproject/files/data/persons.csv
    kDocs:
      kRoot: /home/username/Desktop/myproject/files/docs
      kSchema: /home/username/Desktop/myproject/files/docs/schema.txt

2. Using path_chain function, which returns nested path_chain objects.

path.chain <- path_chain(temp_path("files"), naming = naming_fun)

class(path.chain)
#> [1] "path_chain"

print(path.chain$kData$kExample1)
#> [1] "Invalid file"
#> [1] "files/data/example1.RData"

# Most verbose version
path.chain %>% 
  as.list(root.name = "kRoot") %>%
  as_config("default", "kDirs") %>% 
  yaml::write_yaml(temp_path("config.yaml"))
#> [1] "Invalid file"
#> [1] "Invalid file"
#> [1] "Invalid file"

# Conciser
path.chain %>% 
  as_config("default", "kDirs", root.name = "kRoot") %>% 
  yaml::write_yaml(temp_path("config.yaml"))
#> [1] "Invalid file"
#> [1] "Invalid file"
#> [1] "Invalid file"

You can also use only.directories flag or specify levels to narrow down the results.

default:
  kDirs:
    kRoot: files/
    kData:
      kRoot: data/
      kExample1: kExample1
      kExample2: kExample2
      kPersons: kPersons
    kDocs:
      kRoot: docs/
      kSchema: kSchema

As you can see, such structure of the config file seems to be more legible than the one produced with full_path_chain function. The config file shown above can be easily consumed using config package and as_path_chain function.

k.dirs <- config::get("kDirs", "default", temp_path("config.yaml")) %>% 
  as_path_chain()

class(k.dirs)
#> [1] "path_chain"

k.dirs$kData$.
#> [1] "Invalid file"
#> [1] "files/data"
k.dirs$kData$kExample1
#> [1] "Invalid file"
#> [1] "files/data/example1.RData"

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.