在用户定义的函数中使用数据帧变量作为参数
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
作为示例输出。
我想将数据框中的变量传递给我编写的函数。当我手动输入文件名作为参数时,该函数起作用,使用 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 tablemakGt(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
作为示例输出。