R的subset()函数内的命名空间冲突[重复]

umuewwlo  于 2023-05-11  发布在  其他
关注(0)|答案(1)|浏览(142)

此问题已在此处有答案

Subsetting data frame using variable with same name as column(3个答案)
6天前关闭。
我在R的subset函数中多次遇到以下命名空间问题,因此我想在这里寻求一个比我更优雅的解决方案:

Species <- 'setosa'
subset(iris, Species==Species)

返回整个iris数据集,我想是因为Species==Species的计算结果为true。
我的解决办法是

subset(iris, Species==get('Species', envir = .GlobalEnv)

但是当变量Species仅在函数的范围内定义时,这将不起作用。
当然,也可以使用不同的变量名,如species(小写)作为全局变量。然而,我认为这实际上可读性较差,作为最终用户,我实际上希望R允许对来自不同名称空间的两个同名变量进行这种比较。

axzmvihb

axzmvihb1#

基R subset函数不能很好地处理变量名相同的情况。我认为这是subset帮助页包含以下警告的原因之一
这是一个用于交互式使用的便利功能。对于编程,最好使用标准的子集函数,如[,特别是参数子集的非标准评估可能会产生意想不到的后果。
这条信息基本上是建议你使用

iris[iris$Species==Species, ]

get()的替代方法是使用globalenv()函数来获取全局环境

subset(iris, Species==globalenv()$Species)

如果您使用的是dplyrs filter()函数,则可以使用代词.env显式表示

dplyr::filter(iris, Species==.env$Species)

相关问题