R 当没有数据应用时,是否可以跳过绘图添加标记()行?

R 当没有数据应用时,是否可以跳过绘图添加标记()行?,r,shiny,plotly,R,Shiny,Plotly,我有一个闪亮的应用程序,可以根据用户的输入查询动态显示绘图。举个简单的例子,我将解释如何使用mtcars数据集。我的问题是,对于某些数据集,不存在mtcars$mpg>19和mtcars$mpg26),y=mtcars$mpg[mtcars$mpg>26],标记=列表(颜色='红色',符号='圆形')) 也许有一个更优雅的解决方案,但您可以将标记的数据存储在一个列表中,并按如下方式循环该列表: subsets = list(list(indices = mtcars$mpg < 18,c

我有一个闪亮的应用程序,可以根据用户的输入查询动态显示绘图。举个简单的例子,我将解释如何使用
mtcars
数据集。我的问题是,对于某些数据集,不存在
mtcars$mpg>19和mtcars$mpg<25的值。如何修改此代码以使其适用于所有可能的数据集?(即所有
mtcars$mpg<18
或所有
mtcars$mpg>19和<25
或所有
mtcars$mpg>26

我希望有某种参数可以传递给
add_markers()
比如
required=FALSE
,如果没有数据应用,它可以跳过该行。现在我得到了一个错误:

错误:必须提供
x
y
属性

我怎样才能避免这种情况

 p <- plot_ly(type = "scatter", mode = 'markers') %>%
      add_markers(x = which(mtcars$mpg < 18), y = mtcars$mpg[mtcars$mpg < 18], marker = list(color = 'black', symbol = 'cross')) %>%
      add_markers(x = which(mtcars$mpg > 19 & mtcars$mpg < 25), y = mtcars$mpg[mtcars$mpg > 19 & mtcars$mpg <25], marker = list(color = 'orange', symbol = 'square')) %>%
      add_markers(x = which(mtcars$mpg > 26), y = mtcars$mpg[mtcars$mpg > 26], marker = list(color = 'red', symbol = 'circle'))
p%
添加标记(x=哪个(mtcars$mpg<18),y=mtcars$mpg[mtcars$mpg<18],标记=列表(颜色='黑色',符号='交叉'))%>%
添加_标记(x=哪个(mtcars$mpg>19和mtcars$mpg<25),y=mtcars$mpg[mtcars$mpg>19和mtcars$mpg%
添加标记(x=哪个(mtcars$mpg>26),y=mtcars$mpg[mtcars$mpg>26],标记=列表(颜色='红色',符号='圆形'))

也许有一个更优雅的解决方案,但您可以将标记的数据存储在一个列表中,并按如下方式循环该列表:

subsets  = list(list(indices = mtcars$mpg < 18,color='black', symbol='cross'),
                list(indices = mtcars$mpg > 19 & mtcars$mpg < 25,color = 'orange', symbol = 'square'),
                list(indices = mtcars$mpg > 26,color = 'red', symbol = 'circle'))

p <- plot_ly(type = "scatter", mode = 'markers')
for(i in 1:length(subsets))
{
  z = subsets[[i]]
  if(sum(z$indices)>0) p %<>% add_markers(x = which(z$indices), y = mtcars$mpg[z$indices], marker = list(color = z$color, symbol = z$symbol)) 
}
subsets=list(list(index=mtcars$mpg<18,color='black',symbol='cross'),
列表(索引=mtcars$mpg>19和mtcars$mpg<25,颜色=橙色,符号=方形),
列表(索引=mtcars$mpg>26,颜色=红色,符号=圆形)
p 0)p%%添加标记(x=which(z$index),y=mtcars$mpg[z$index],标记=list(color=z$color,symbol=z$symbol))
}

这将防止出现错误,即使在使用
mtcars=head(mtcars,10)
运行时,其中三个组中的一个组没有数据。

也许有一个更优雅的解决方案,但您可以将标记的数据存储在列表中,并按如下方式循环该列表:

subsets  = list(list(indices = mtcars$mpg < 18,color='black', symbol='cross'),
                list(indices = mtcars$mpg > 19 & mtcars$mpg < 25,color = 'orange', symbol = 'square'),
                list(indices = mtcars$mpg > 26,color = 'red', symbol = 'circle'))

p <- plot_ly(type = "scatter", mode = 'markers')
for(i in 1:length(subsets))
{
  z = subsets[[i]]
  if(sum(z$indices)>0) p %<>% add_markers(x = which(z$indices), y = mtcars$mpg[z$indices], marker = list(color = z$color, symbol = z$symbol)) 
}
subsets=list(list(index=mtcars$mpg<18,color='black',symbol='cross'),
列表(索引=mtcars$mpg>19和mtcars$mpg<25,颜色=橙色,符号=方形),
列表(索引=mtcars$mpg>26,颜色=红色,符号=圆形)
p 0)p%%添加标记(x=which(z$index),y=mtcars$mpg[z$index],标记=list(color=z$color,symbol=z$symbol))
}
这将防止出现错误,即使在使用
mtcars=head(mtcars,10)
运行时,其中三个组中的一个没有数据