使用R中的循环组合并绘制多个函数
我尝试将两个函数与R中的循环结合起来,并创建一个绘图,其中两个Y向量都是针对公共X向量绘制的。 我已经能够分别编写和绘制每个函数。 我不知道如何将这两个功能结合起来,并将它们放在一个绘图中。还有,是否有一种方法可以导出结果向量,以便我可以在循环之外使用该数据?我的向量“结果”不存储在环境中使用R中的循环组合并绘制多个函数,r,function,loops,plot,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(m
#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)
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
#功能#1:
k=1000
x=序列(从=1到=k,由=1)
sumfun使用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()
这就是我得到的:总结一下,使用@bala83中的sapply
尝试在环境中存储向量
#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)
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
给出:
如果你想画一条线和一个图例,那么就这样做
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"))
给出:
您甚至不需要应用,有一个累积和的现成函数。我提供了一个使用ggplot库进行绘图的解决方案,它比base 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")
函数points()
可以像plot()
一样使用,但它会将点添加到现有的绘图中。计算?点
以查看帮助文件。使用sapply时,我得到一个错误,x和y的长度不同。@kxb35是的,对不起,我使用了sum而不是cumsum哈哈!现在它应该可以工作了:)我不熟悉ggplot,不知道如何处理这个错误“aes中的错误(1:k,log(y,color=~sum.type))+xlab(“k”):二进制运算符的非数字参数”看起来数据框是2000行而不是1000行。@kxb35是的,我应该在添加答案之前测试我的代码哈哈!对不起,伙计ggplot
可能更可取,但OP仍应了解点()
+1