在用户定义的函数中使用数据帧变量作为参数

Using dataframe variable as argument in user-defined function

我想将数据框中的变量传递给我编写的函数。当我手动输入文件名作为参数时,该函数起作用,使用 gt 包创建一个 png 文件。但是,当我尝试传递包含函数所需的所有文件名的数据框中的列时,它失败了。我想使用列中的值创建所有需要的 png 文件。

我不能分享真实数据。以下是虚构和简化的示例。

正在创建数据

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())

使用数据框 George

为 George 保存一个 png 格式的 gt table
makGt(George) # creates png file for George using function

使用 beatles$fName 中的值创建 png 文件的尝试(多次尝试中的两次)徒劳。

# 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 友好的代码将不胜感激或使用应用系列。非常感谢您的帮助。

makGt 函数中,您需要 get() 对象的值(在您的情况下,从 [=14] 获取 purrr 创建的数据帧=]).

library(tidyverse)
library(gt)

fName <- c('John' , 'Paul' , 'George' , 'Ringo')
byr <- c(1940 , 1942 , 1943 , 1940)
beatles <- data.frame(fName , byr) %>% arrange(fName)

purrr::set_names(beatles %>% 
                   group_by(fName) %>%
                   group_split(), beatles$fName) %>%
  list2env(envir = globalenv())

makGt <- function(x) {
  get(beatles$fName[x])[1] %>% 
    gt() %>% 
    gtsave(filename = sprintf('fab4%s.png' , 
                              beatles[x, 1]),
           path = getwd())
}

sapply(1:nrow(beatles), makGt)

这将在您的工作目录中保存四个 .png 个文件,名称为 fab4[fName].png。我将 fab4George.png 作为示例输出。