Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R中的循环组合并绘制多个函数_R_Function_Loops_Plot - Fatal编程技术网

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

使用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

我尝试将两个函数与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)
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