当我需要过滤data.frame,即提取满足特定条件的行时,我更喜欢使用该subset函数:
subset(airquality, Month == 8 & Temp > 90)
Run Code Online (Sandbox Code Playgroud)
而不是[功能:
airquality[airquality$Month == 8 & airquality$Temp > 90, ]
Run Code Online (Sandbox Code Playgroud)
我偏好有两个主要原因:
我发现代码从左到右读得更好.甚至那些对R一无所知的人也可以说出subset上面的陈述是做什么的.
因为列可以在select表达式中称为变量,所以我可以节省一些键击.在我上面的例子中,我只需输入airquality一次subset,但只输入三次[.
所以我过着幸福快乐,subset随处可见,因为它更短,读起来更好,甚至为我的R编码员提倡它的美丽.但昨天我的世界崩溃了.在阅读subset文档时,我注意到这一节:
警告
这是一种便于交互使用的便利功能.对于编程,最好使用像[的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果.
有人可以帮助澄清作者的意思吗?
首先,他们的意思是" 交互使用 "?我知道什么是交互式会话,而不是在BATCH模式下运行的脚本,但我不知道它应该有什么区别.
那么,请你解释一下" 论证子集的非标准评估 "以及为什么它是危险的,或许可以提供一个例子?
我正在尝试为不同的对象类编写一个子集方法,我希望用户能够以与使用该subset.data.frame函数相同的方式执行.我读过像一些相关的文章这个和这个,但我不认为他们在这里是解决方案.我相信我使用的是错误的环境,但是我对环境以及substitute找出为什么这部分代码的前半部分有效而下半部分无法理解的功能也不太了解.任何人都可以解释我在下面做错了什么,然后如何制作一个lsubset可以gear == 4作为其第二个参数的工作函数?对不起,如果我的搜索错过了类似的问题..谢谢!!
# create a list of mtcars data frames
mtlist <- list( mtcars , mtcars , mtcars )
# subset them all - this works
lapply( mtlist , subset , gear == 4 )
# create a function that simply replicates the task above
lsubset <-
function( x , sset ){
lapply( x , subset , sset )
}
# this does not work for some …Run Code Online (Sandbox Code Playgroud)