使用数据帧列表时,如何在循环中添加add_trace
我使用下面的代码继续获取以下代码
df1<-c(seq(1:32))
df2<-df*2
df3<-df2*8
dff1<-sqrt(df1)
dff2<-sqrt(df2)
dff3<-sqrt(df3)
a<-cbind.data.frame(df1,dff1)
b<-cbind.data.frame(df2,dff2)
c<-cbind.data.frame(df3,dff3)
colnames(a)<-c("df1","df2")
colnames(b)<-c("df1","df2")
colnames(c)<-c("df1","df2")
df<-list()
df[[1]]<-a
df[[2]]<-b
df[[3]]<-c
pl<-plot_ly()
for(i in 1:3){
pl<- add_trace(pl,data=df[[i]],x=~df[[i]]$df1,y=~df[[i]]$df2,mode='lines',type='scatter')
}
pl
当使用lapply而不是for循环时,我得到三个单独的图形而不是一个带有三行的图形
pl<-plot_ly()
pl<-lapply(1:3, function(i){
pl<- pl%>%
add_trace(data=df[[i]],x=~df[[i]]$df1,y=~df[[i]]$df2,mode='lines',type='scatter',inherit = TRUE)
})
pl
答案 0 :(得分:1)
虽然其他用户正确地指出,只需使用for循环即可完成此操作,但我想我也可以对以后遇到此问题的任何人使用lapply()进行回答。
这可以通过使用get()方法使用lapply()完成,该方法允许您在检索变量时指定环境。用invisible()包装您的lapply可以防止循环在运行时将中间内容打印到控制台/查看器。
代码如下:
df1<-c(seq(1:32))
df2<-df1*2
df3<-df2*8
dff1<-sqrt(df1)
dff2<-sqrt(df2)
dff3<-sqrt(df3)
a<-cbind.data.frame(df1,dff1)
b<-cbind.data.frame(df2,dff2)
c<-cbind.data.frame(df3,dff3)
colnames(a)<-c("df1","df2")
colnames(b)<-c("df1","df2")
colnames(c)<-c("df1","df2")
df<-list()
df[[1]]<-a
df[[2]]<-b
df[[3]]<-c
pl<-plot_ly()
invisible(lapply(seq_along(df), FUN = function(i) {
pl <<- get("pl", envir = globalenv()) %>%
add_trace(pl,data=df[[i]],x=~df[[i]]$df1,y=~df[[i]]$df2,mode='lines',type='scatter')
}))
pl