You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:15:32