R语言中对应.subset2的无分派赋值操作等价实现是什么?
R语言无方法分派的下标赋值实现方案
R中.subset2是无分派读取操作的底层实现,对应的无分派赋值操作可以通过以下两种方式实现:
方案1:直接调用base包内部未导出的.subset2<-函数
.subset2对应的赋值函数本身是存在的,只是作为base包的内部非导出函数,默认不在搜索路径内,需要加base:::前缀显式访问,示例代码如下:
a <- new.env() a$foo <- 3 # 无分派赋值 base:::.subset2(a, "foo") <- 5 # 验证赋值结果 .subset2(a, "foo") # 输出 [1] 5
该方案为通用实现,支持环境、列表、向量等所有.subset2兼容的对象类型,全程不会触发[[<-或$<-的S3/S4方法分派。
方案2:针对特定类型使用原生无分派函数
如果不想调用未导出函数,可以根据操作对象类型选择对应的原生无分派接口:
- 操作对象为环境时,直接使用
assign函数,本身无方法分派:a <- new.env() assign("foo", 5, envir = a) - 操作对象为列表/向量等递归对象时,直接调用
[[<-的原始实现跳过分派:lst <- list(foo = 3) # 获取原始版本的[[<-,跳过方法分派 raw_bracket_assign <- getPrimitiveFunction("[[<-") lst <- raw_bracket_assign(lst, "foo", 5)
内容的提问来源于stack exchange,提问作者Stefano Borini
相关产品推荐
相关产品推荐

