使用tibble创建数据框时无法正确引用外部向量的问题
问题原因
tibble构造时采用顺序求值机制:参数会在正在构建的tibble内部环境中按顺序求值,前序定义的列会被后续参数优先调用,优先级高于全局环境变量。
你在第一列已经定义了名为vec的列,值为重复的"A",第二列vec_new = vec调用时,会直接引用刚生成的内部vec列,而非全局环境中预定义的vec <- c("A", "B", "C")向量,最终导致两列取值完全一致。
而base R的data.frame和data.table的参数会优先在调用的父环境(即你的工作环境)中完成所有求值,再组装为表格,因此不会出现内部变量覆盖外部的问题。
最优解决方法
推荐使用tidyverse官方指定的.env代词明确指定调用外部环境变量,不需要修改列名即可避免覆盖问题:
library(tibble) vec <- c("A", "B", "C") tibble( vec = rep(vec[1], length(vec)), vec_new = .env$vec ) # 输出结果: # # A tibble: 3 × 2 # vec vec_new # <chr> <chr> # 1 A A # 2 A B # 3 A C
也可以选择调整内部列名,避免和外部预定义向量重名:
tibble( repeat_vec = rep(vec[1], length(vec)), vec_new = vec )
内容的提问来源于stack exchange,提问作者www
相关产品推荐
相关产品推荐

