相关疑难解决方法(0)

为什么`[`比`子集更好?

当我需要过滤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)

我偏好有两个主要原因:

  1. 我发现代码从左到右读得更好.甚至那些对R一无所知的人也可以说出subset上面的陈述是做什么的.

  2. 因为列可以在select表达式中称为变量,所以我可以节省一些键击.在我上面的例子中,我只需输入airquality一次subset,但只输入三次[.

所以我过着幸福快乐,subset随处可见,因为它更短,读起来更好,甚至为我的R编码员提倡它的美丽.但昨天我的世界崩溃了.在阅读subset文档时,我注意到这一节:

警告

这是一种便于交互使用的便利功能.对于编程,最好使用像[的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果.

有人可以帮助澄清作者的意思吗?

首先,他们的意思是" 交互使用 "?我知道什么是交互式会话,而不是在BATCH模式下运行的脚本,但我不知道它应该有什么区别.

那么,请你解释一下" 论证子集的非标准评估 "以及为什么它是危险的,或许可以提供一个例子?

r subset filter r-faq

392
推荐指数
2
解决办法
9万
查看次数

在ggplot中的函数内的aes(...)中变量的范围

考虑一下ggplot(...)函数内部的这种用法.

x  <- seq(1,10,by=0.1)
df <- data.frame(x,y1=x, y2=cos(2*x)/(1+x))

library(ggplot2)
gg.fun <- function(){
  i=2
  plot(ggplot(df,aes(x=x,y=df[,i]))+geom_line())
}

if(exists("i")) remove(i)
gg.fun()
# Error in `[.data.frame`(df, , i) : object 'i' not found
i=3
gg.fun()   # plots df[,3] vs. x
Run Code Online (Sandbox Code Playgroud)

看起来ggplot似乎无法识别i函数内定义的变量,但确实识别i它是否在全局环境中定义.这是为什么?

请注意,这给出了预期的结果.

gg.new <- function(){
  i=2
  plot(ggplot(data.frame(x=df$x,y=df[,i]),aes(x,y)) + geom_line())
}
if(exists("i")) remove(i)
gg.new()   # plots df[,2] vs. x
i=3
gg.new()   # also plots df[,2] vs. x
Run Code Online (Sandbox Code Playgroud)

r ggplot2 nse standard-evaluation non-standard-evaluation

7
推荐指数
1
解决办法
1142
查看次数