自定义pins包pin_write函数:如何传入数据框对象及名称字符串
自定义pins包pin_write函数的问题与解决方法
问题描述
想要自定义pins包的pin_write函数,实现传入数据框对象时自动使用对象名称作为pin的名称,但自定义函数运行后,pin名称显示为函数参数名df而非传入的对象名(如iris)。
原函数使用示例
library(pins) # 创建board: board_versioned <- board_folder("your path", versioned = TRUE) board_versioned %>% pin_write(iris, "iris") # 输出: # Guessing `type = 'rds'` # Creating new version '20221030T182552Z-f2bf1' # Writing to pin 'iris'
自定义函数的问题
编写的自定义函数my_pin_write如下,调用后输出显示pin名称为df,不符合预期:
library(pins) my_pin_write <- function(board, df) { board %>% pin_write(df, deparse(substitute(df))) } my_pin_write(board_versioned, iris) # 输出: # Guessing `type = 'rds'` # Replacing version '20221030T182736Z-f2bf1' with '20221030T182750Z-f2bf1' # Writing to pin 'df'
解决方案
修改自定义函数,明确捕获传入参数的原始名称并传递给pin_write的name参数:
library(pins) my_pin_write <- function(board, df) { # 捕获传入数据框的原始名称 pin_name <- deparse(substitute(df)) board %>% pin_write(x = df, name = pin_name) } # 调用验证 board_versioned <- board_folder("your path", versioned = TRUE) my_pin_write(board_versioned, iris) # 预期输出: # Guessing `type = 'rds'` # Creating new version 'xxxxxxTxxxxxxZ-xxxxx' # Writing to pin 'iris'
原理说明
substitute(df)会在函数的调用环境中捕获传入的参数表达式,而非函数内部的变量名。当调用my_pin_write(board_versioned, iris)时,substitute(df)返回符号iris,deparse()将其转换为字符串"iris",以此作为pin的名称,实现自动使用传入对象的名称作为pin名的需求。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

