绘制内部功能:集(DF,ID _ == ...)给出错误的情节,DF [DF $ ID _ == .

2019-10-20 01:59发布

我有多个Y系列,我想单独绘制DF,所以我写了选择一个特定的系列,分配给一个局部变量FN dat ,然后绘制它。 按fn内部调用不正确地对待它像一个系列时,然而ggplot / geom_step。 我看不出这可能是一个范围的问题,因为如果dat是不可见的,肯定ggplot会失败?

您可以验证从顶层环境中执行的时候,而不是在函数内部的代码是正确的。 这不是一个重复的问题。 我理解这个问题(这是一个ggplot反复出现的问题),但我读过所有其他的答案; 这不是一个重复的,他们不给予解决。

set.seed(1234)
require(ggplot2)
require(scales)

N = 10
df <- data.frame(x = 1:N,
                 id_ = c(rep(20,N), rep(25,N), rep(33,N)),
                 y = c(runif(N, 1.2e6, 2.9e6), runif(N, 5.8e5, 8.9e5) ,runif(N, 2.4e5, 3.3e5)),
                 row.names=NULL)

plot_series <- function(id_, envir=environment()) {
  dat <- subset(df,id_==id_)
  p <- ggplot(data=dat, mapping=aes(x,y), color='red') + geom_step()
  # Unsuccessfully trying the approach from http://stackoverflow.com/questions/22287498/scoping-of-variables-in-aes-inside-a-function-in-ggplot
  p$plot_env <- envir
  plot(p)
  # Displays wrongly whether we do the plot here inside fn, or return the object to parent environment 
  return(p)
}

 # BAD: doesn't plot geom_step!
plot_series(20)

# GOOD! but what's causing the difference?
ggplot(data=subset(df,id_==20), mapping=aes(x,y), color='red') + geom_step()

#plot_series(25)
#plot_series(33)

Answer 1:

这工作正常:

plot_series <- function(id_) {
    dat <- df[df$id_ == id_,]
    p <- ggplot(data=dat, mapping=aes(x,y), color='red') + geom_step()
    return(p)
}

print(plot_series(20))

如果您只需通过原有的功能使用步骤debug ,你很快就会看到, subset行实际上并没有子集的数据帧都:它返回的所有行!

为什么? 由于subset使用非标准的评价,你同时为列名,函数参数使用相同的名称。 正如上面jlhoward表明,它会工作(但可能没有最好),以简单地使用不同的名称为两个。

其原因是subset与所述数据帧计算第一。 因此,所有它认为在逻辑表达式是总是正确的id_ == id_该数据帧中。

想一想一种方法是装傻(如计算机),然后问自己,当与状态呈现id_ == id_你怎么知道究竟每个符号表示。 这是明确的, subset作出一致的选择:用什么数据帧。



Answer 2:

尽管有意见,这个工作:

plot_series <- function(z, envir=environment()) {
  dat <- subset(df,id_==z)
  p <- ggplot(data=dat, mapping=aes(x,y), color='red') + geom_step()
  p$plot_env <- envir
  plot(p)
  # Displays wrongly whether we do the plot here inside fn, or return the object to parent environment 
  return(p)
}

plot_series(20)

这个问题似乎是该子集是解释id_上的RHS ==到LHS为完全相同,这等同于转租上T ,这当然包括的所有行df 。 这就是你所看到的情节。



文章来源: Plotting inside function: subset(df,id_==…) gives wrong plot, df[df$id_==…,] is right