使用R中的循环组合并绘制多个函数

时间:2018-03-24 12:39:02

标签: r function loops plot

我试图将两个函数与R中的循环组合,并创建一个图,其中两个Y向量相对于公共X向量绘制。 我已经能够分别编写和绘制每个函数。 我不知道如何将这两个函数结合起来并将它们放在一个图中。还有,有没有办法导出结果向量,以便我可以在循环外使用该数据?我的载体"结果"不存储在环境中。

#Function #1:
k=1000
x=seq(from=1, to=k, by=1)
sumfun<-function(y){
  sum<-0
  result<-vector(mode="numeric")
  for(i in 1:k) {
    sum=sum+(1/i)
    result[i]<-sum
  }
plot(x,result, log="y",xlab="k",ylab="1, 1+1/2,..+1/k")
}
sumfun(x)

#Function #2
k=1000
x=seq(from=1, to=k, by=1)
sumfun<-function(y){
  sum<-0
  result<-vector(mode="numeric")
  for(i in 1:k) {
    sum=sum+(1/i)^2
    result[i]<-sum
  }
plot(x,result, log="y", xlab="k",ylab="1, 1+(1/2)^2,..+(1/k)^2")
}
sumfun(x)

3 个答案:

答案 0 :(得分:1)

总结一下,使用@ bala83的sapply尝试将您的矢量存储在环境中。

y1 <- cumsum(sapply(1:k, function(i) 1/i))  # results from your 1st function
y2 <- cumsum(sapply(1:k, function(i) 1/i^2))  # results from 2nd

然后使用points()作为@John Coleman评论的第二个情节。

plot(y1, xlab="k",ylab="1, 1+(1/2)^2,..+(1/k)^2")  # plots 1st
points(y2)  # adds 2nd to the plot

<强> 给出:

enter image description here

如果您想绘制线条并有图例,请执行此操作

plot(y1, xlab="k",ylab="1, 1+(1/2)^2,..+(1/k)^2", type = "l")
points(y2, type = "l", col="red")
legend(720, 6.7, 
       c("Results 1","Results 2"), 
       lwd=c(1,1), cex=.8,  col=c("black","red"))  

<强> 给出:

enter image description here

答案 1 :(得分:1)

您甚至不需要申请,累积金额有一个现成的功能。我提供了一个用ggplot库绘制的解决方案,它比基础R绘图更受欢迎

library(reshape2)
library(ggplot)
library(tidyverse)

k=1000
result1=cumsum(1/seq(from=1, to=k, by=1))
result2=cumsum(1/seq(from=1, to=k, by=1)^2)
x=1:k
df=tibble(x,result1,result2)%>%melt(measure.vars=c("result1","result2"))
ggplot(df)+geom_point(aes(x=x,y=value,col=variable))+ylab("1, 1+1/2,..+1/k")+xlab("k")

enter image description here

答案 2 :(得分:0)

使用apply比循环更快。您的结果现在也在父母环境中。

library(ggplot2)
k=1000
y1 = cumsum(sapply(1:k, function(i) 1/i))
y2 = cumsum(sapply(1:k, function(i) 1/i**2))
df = data.frame("y"=c(y1,y2), "sum.type"=as.factor(rep(c("1","2"),each=k)))
ggplot(df,aes(c(1:k,1:k),log(y),color=sum.type)) + geom_point()+xlab("k")+ylab("Sum")+theme_classic()

这就是我得到的:enter image description here