首页 > 解决方案 > ggplot2 在函数中不起作用,但在外部起作用

问题描述

我尝试运行ggplot2,但它在以下函数中不起作用foo()。为什么?

foo <- function(aaa=TRUE) {

  df<-data.frame(x=c(10,100,1000,10,100,1000),
                 y=c(1100,220000,33000000,1300,240000,36000000),
                 group=c("1","1","1","2","2","2")
  )



if (aaa==TRUE) {
  ggplot2::ggplot(df, aes(x = x, y = y, shape = group)) +
    ggplot2::geom_line(position = position_dodge(0.2)) +           # Dodge lines by 0.2
    ggplot2::geom_point(position = position_dodge(0.2), size = 4)+  # Dodge points by 0.2
    ggplot2::scale_y_log10()+
    ggplot2::scale_x_log10()
}

  if (aaa==FALSE) {
    ggplot2::ggplot(df, aes(x = x, y = y, shape = group)) +
      ggplot2::geom_line(position = position_dodge(0.2)) +           # Dodge lines by 0.2
      ggplot2::geom_point(position = position_dodge(0.2), size = 4)+  # Dodge points by 0.2
      ggplot2::scale_y_log10()
      # ggplot2::scale_x_log10()
  }

}

我不明白为什么 foo(T)不工作但foo(F)工作。

请注意, foo(T) 运行以下代码,它在 function 之外工作foo

df<-data.frame(x=c(10,100,1000,10,100,1000),
               y=c(1100,220000,33000000,1300,240000,36000000),
               group=c("1","1","1","2","2","2")
)

ggplot2::ggplot(df, aes(x = x, y = y, shape = group)) +
  ggplot2::geom_line(position = position_dodge(0.2)) +           # Dodge lines by 0.2
  ggplot2::geom_point(position = position_dodge(0.2), size = 4)+  # Dodge points by 0.2
  ggplot2::scale_y_log10()+
  ggplot2::scale_x_log10()

编辑答案@Ronak Shah

如果我们if连续使用语句,那么它会丢失对象,如下代码所示。

df<-data.frame(x=c(10,100,1000,10,100,1000),
               y=c(1100,220000,33000000,1300,240000,36000000),
               group=c("1","1","1","2","2","2")
)

aaa<-TRUE

if (aaa==TRUE) {
  ggplot2::ggplot(df, aes(x = x, y = y, shape = group)) +
    ggplot2::geom_line(position = position_dodge(0.2)) +           # Dodge lines by 0.2
    ggplot2::geom_point(position = position_dodge(0.2), size = 4)+  # Dodge points by 0.2
    ggplot2::scale_y_log10()+
    ggplot2::scale_x_log10()
}

.Last.value

if (aaa==FALSE) {
  ggplot2::ggplot(df, aes(x = x, y = y, shape = group)) +
    ggplot2::geom_line(position = position_dodge(0.2)) +           # Dodge lines by 0.2
    ggplot2::geom_point(position = position_dodge(0.2), size = 4)+  # Dodge points by 0.2
    ggplot2::scale_y_log10()
  # ggplot2::scale_x_log10()
}

.Last.value

编辑@Jules Stuifbergen的答案

使用return()

# General print of log scale

foo <- function(aaa=TRUE) {

  df<-data.frame(x=c(10,100,1000,10,100,1000),
                 y=c(1100,220000,33000000,1300,240000,36000000),
                 group=c("1","1","1","2","2","2")
  )



if (aaa==TRUE) {
 return( ggplot2::ggplot(df, aes(x = x, y = y, shape = group)) +
    ggplot2::geom_line(position = position_dodge(0.2)) +           # Dodge lines by 0.2
    ggplot2::geom_point(position = position_dodge(0.2), size = 4)+  # Dodge points by 0.2
    ggplot2::scale_y_log10()+
    ggplot2::scale_x_log10()
 )

}

  if (aaa==FALSE) {
    ggplot2::ggplot(df, aes(x = x, y = y, shape = group)) +
      ggplot2::geom_line(position = position_dodge(0.2)) +           # Dodge lines by 0.2
      ggplot2::geom_point(position = position_dodge(0.2), size = 4)+  # Dodge points by 0.2
      ggplot2::scale_y_log10()
      # ggplot2::scale_x_log10()

  }

}

标签: rggplot2

解决方案


return除非您明确提及,否则函数会返回函数最后一行中存在的对象。在您的功能中,您有两个if条件。什么时候aaaTRUE会进入if函数内部,然后检查下if (aaa==FALSE)一条语句,因此,原始ggplot对象在什么时候aaa丢失TRUE

您的功能只需将 second 替换if为 only即可else。另请注意,如果您的条件已经合乎逻辑,则无需检查if(aaa==TRUE),只需检查即可if (aaa)

所以把函数改成

foo <- function(aaa=TRUE) {

  df<-data.frame(x=c(10,100,1000,10,100,1000),
             y=c(1100,220000,33000000,1300,240000,36000000),
             group=c("1","1","1","2","2","2"))

  if (aaa) {
    ggplot2::ggplot(df, aes(x = x, y = y, shape = group)) +
      ggplot2::geom_line(position = position_dodge(0.2)) +         
      ggplot2::geom_point(position = position_dodge(0.2), size = 4)+
      ggplot2::scale_y_log10()+
      ggplot2::scale_x_log10()
  }
  else {
     ggplot2::ggplot(df, aes(x = x, y = y, shape = group)) +
      ggplot2::geom_line(position = position_dodge(0.2)) +        
      ggplot2::geom_point(position = position_dodge(0.2), size = 4) +
      ggplot2::scale_y_log10()  
  }
}

推荐阅读