R语言data.frame()为何无法引用同次调用创建的其他变量?
在R语言中使用data.frame()函数创建包含多个变量的数据框时,无法在变量定义表达式中引用同一次data.frame()调用内生成的其他变量,该现象可通过下方代码复现:
- 示例1可正常运行,因为
x和y的表达式不依赖运行环境中的其他对象 - 示例2运行报错,提示找不到对象
x - 示例3中若提前在全局环境赋值
x <- 5,同次调用内创建x = 0时,y会引用全局环境的x计算得到6,而非引用同次创建的x得到1
现象成因猜想
目前有两种暂未验证的解释(此处为双关:evaluate兼具“验证判断”和R语言中“求值”的技术含义):
- 作用域机制:各赋值表达式虽按顺序求值(即先赋值
x再赋值y),但仅会在data.frame()的调用环境中查找对象。由于示例2中data.frame()在全局环境调用,但全局环境中不存在x,因此触发报错;这也可以解释示例3中y = 6而非y = 1的结果。 - 求值机制:所有赋值表达式为并行同时求值,导致计算依赖
x的y值时,x尚未在任何环境中存在。尽管R采用词法(即静态)作用域,data.frame()的设计并未将同次调用内生成的变量纳入查找范围。
复现代码如下:
# 示例1(运行成功) data.frame(x = 0, y = 0 + 1) #> x y #> 1 0 1 # 示例2(运行失败) data.frame(x = 0, y = x + 1) #> Error in data.frame(x = 0, y = x + 1): object 'x' not found # 示例3 x <- 5 data.frame(x = 0, y = x + 1) #> x y #> 1 0 6
替代实现方案
如果需要在创建数据框时引用同次生成的其他变量,tibble::tibble()是非常合适的替代方案,用法示例如下:
library(tibble) # tibble示例1:y可直接引用同次调用创建的x tibble(x = 0, y = x + 1) #> # A tibble: 1 x 2 #> x y #> <dbl> <dbl> #> 1 0 1 # tibble示例2:y优先引用同次调用创建的x,忽略全局环境中的x x <- 5 tibble(x = 0, y = x + 1) #> # A tibble: 1 x 2 #> x y #> <dbl> <dbl> #> 1 0 1
内容的提问来源于stack exchange,提问作者socialscientist
相关产品推荐
相关产品推荐

