I would like to pass a variable in a dataframe to a function I've written. The function works, creating a png file with the gt package, when I manually type in a file name as the argument. However, when I attempt to pass a column in a dataframe that contains all the filenames needed to the function, it fails. I would like to create all the png files needed using the values in the column.
I can't share the real data. Fictional and simplified example follows.
Creating data
library(tidyverse)
library(gt)
# function makes png file from dataframe x
makGt <- function(x) {
select(x , fName) %>%
gt(.) %>%
gtsave(sprintf('fab4%s.png' , x[1,1]))
}
# example data
fName <- c('John' , 'Paul' , 'George' , 'Ringo')
byr <- c(1940 , 1942 , 1943 , 1940)
beatles <- data.frame(fName , byr) %>% arrange(fName)
# make individual files for each beatle
purrr::set_names(beatles %>%
group_by(fName) %>%
group_split(), beatles$fName) %>%
list2env(envir = globalenv())
Save a gt table in png format for George using the dataframe George
makGt(George) # creates png file for George using function
Futile attempts (two of many) to create png files using values from beatles$fName.
# attempts to use beatles fName variable in function makGt
makGt(sprintf('fab4%s' , beatles[1,1])) # results in error
sapply(beatles$fName , FUN = makGt) # error is same as above
Tidyverse-friendly code would be appreciated or using apply family. Many thanks for any help.
CodePudding user response:
Hope I get your question correctly.
library(tidyverse)
library(gt)
fName <- c('John' , 'Paul' , 'George' , 'Ringo')
byr <- c(1940 , 1942 , 1943 , 1940)
beatles <- data.frame(fName , byr) %>% arrange(fName)
sapply(1:nrow(beatles), function(x) {
beatles[x, 1, drop = FALSE] %>%
gt() %>%
gtsave(filename = sprintf('fab4%s.png' ,
beatles[x, 1]),
path = getwd())
})
Or to fit your format with a function makGt
makGt <- function(x) {
beatles[x, 1, drop = FALSE] %>%
gt() %>%
gtsave(filename = sprintf('fab4%s.png' ,
beatles[x, 1]),
path = getwd())
}
sapply(1:nrow(beatles), makGt)
This will save four .png
files in your working directory with the name fab4[fName].png
. I've included fab4George.png
as an example output.