r - 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()
}
}
解决方案
return
除非您明确提及,否则函数会返回函数最后一行中存在的对象。在您的功能中,您有两个if
条件。什么时候aaa
它TRUE
会进入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()
}
}
推荐阅读
- android - 如何确保Android中只有一个给定的活动?
- python - 如何在python中为类对象定义绑定?
- reactjs - 如何从 firebase 中的每个文档中获取每个集合?(反应)
- android - Android 布局抛出错误索引:0,大小:0
- powerbi - PowerBI 为表 B 中的每个日期重复表 A 中的行
- django - 在 Django 中使用 Plotly 绘制图像
- r - 股份变动百分比
- java - 如何在多模块maven项目中单独构建模块?
- arrays - Mybatis - 将字符串 [] 传递给 Oracle 存储过程
- python-3.x - 多线程中的 Telethon 事件未按预期工作