R中purrr::pwalk遍历df调用assign赋值失效原因及替代方案
代码无法正常工作的原因
参数匹配环节本身没有问题:输入tibble的列名x、value和assign()的前两个正式参数名完全一致,pwalk()会自动按名将列值传给对应参数。
失效的核心原因是赋值环境错误:assign()的默认赋值环境是调用时的父环境,也就是pwalk()内部运行时生成的临时执行环境。所有赋值操作生成的变量都会被创建在这个临时环境中,pwalk运行结束后临时环境会自动销毁,因此你在全局工作环境中找不到预期创建的变量。
简洁度相当的替代实现
以下方案均为一行代码,和原写法的简洁度基本一致:
- 显式为
assign()指定全局环境作为赋值目标,最大程度保留原pwalk写法的逻辑:purrr::pwalk(df, assign, envir = globalenv()) - 用R原生的
list2env()做批量转换,不需要依赖purrr循环,性能更好:list2env(stats::setNames(df$value, df$x), envir = globalenv()) - 如果偏好显式传参的直观逻辑,也可以用
iwalk配合匿名函数实现:purrr::iwalk(df, ~ assign(.x, .y, envir = globalenv()))
内容的提问来源于stack exchange,提问作者JRC
相关产品推荐
相关产品推荐

