首页 > 解决方案 > 从 R 中的函数调用对象 - 找不到错误对象

问题描述

我正在尝试创建一个可变宽度柱形图,每列代表一个非重叠步骤。宽度将是步骤的平均值,高度是每个步骤的标准开发。这是我的原始代码:

df <- data.frame (Steps = c( "Step2", "Step3", "Step4", "Step5", "Step6", "Step7"), Variability = c(sd(dataset$PS02_days_creation_to_validation, na.rm = TRUE), sd(dataset$PS03_days_validation_to_sourcing, na.rm = TRUE), sd(dataset$PS04_days_sourcing_to_confirmation, na.rm = TRUE), sd(dataset$PS05_days_confirmation_to_ship_created, na.rm = TRUE),sd(dataset$PS06_days_ship_created_to_shipped, na.rm = TRUE), sd(dataset$PS07_days_shipped_to_reception,na.rm = TRUE) ), width = c(mean(dataset$PS02_days_creation_to_validation, na.rm = TRUE), mean(dataset$PS03_days_validation_to_sourcing, na.rm = TRUE), mean(dataset$PS04_days_sourcing_to_confirmation, na.rm = TRUE), mean(dataset$PS05_days_confirmation_to_ship_created,na.rm = TRUE), mean(dataset$PS06_days_ship_created_to_shipped,na.rm = TRUE), mean(dataset$PS07_days_shipped_to_reception,na.rm = TRUE) ))

df$w <- cumsum(df$width) #cumulative sums to gt the end points of each column.
df$wm <- df$w - df$width #giving the starting point of each column

library(ggplot2)
p  <- ggplot(df, aes(ymin = 0))
p1 <- p + geom_rect(aes(xmin = wm, xmax = w, ymax = Variability, fill = Steps))
p1

当所有步骤都是肯定的时,此代码可以正常工作。但是,当第一步的宽度为负时,我的列会重叠。
即具有以下宽度=(25,50,75,100)的4步,使用上面的代码创建:终点w =(25,75,150,250)起点wm =(0,25,75,150)。伟大的!

现在,如果第一步的宽度更改为 (-25,50,75,100),那么代码会生成 w:(-25,25,100,200) 和 wm:(0,-25,25,100),这意味着这些步骤是重叠的!!相反,我想修改代码以生成: w=(-25,50,125,225) 和 wm:(0,0,50,125)

一位 R 大师亲切地建议使用此功能:

widths_to_starts_ends <- function(widths){
  
  widths <- widths[widths != 0]
  pos_widths <- widths[widths > 0]
  neg_widths <- widths[widths < 0]
  
  pos_ends <- cumsum(pos_widths)
  pos_starts <- cumsum(pos_widths) - pos_widths
  
  neg_widths <- abs(neg_widths)
  neg_starts <- cumsum(neg_widths)
  neg_ends <- cumsum(neg_widths) - neg_widths
  
  neg_starts <- (-1)*neg_starts
  neg_ends <- (-1)*neg_ends
  
  return( list(s = c(neg_ends, pos_starts), e = c(neg_starts, pos_ends)) )
  
}

widths_to_starts_ends(c(-25,50,75,100))

这导致

$s 
[1] 0   0  50 125

$e
[1] -25  50 125 225 

我想将此函数嵌入到我的原始代码中(用 e 和 s 替换 w 和 wm 行)并制作一个图表,但我不知道如何调用对象 E 和 S。这就是我正在做的事情:

library(ggplot2)
p  <- ggplot(df, aes(ymin = 0))

p1 <- p + geom_rect(aes(xmin = s, xmax = e, ymax = Variability, fill = Steps))
p1

但它说找不到对象 S。请问你能帮帮我吗?

标签: robject

解决方案


s 和 e 似乎是列表的元素,而不是独立的对象,我想这就是为什么找不到它们的原因。在您的函数中,您可以改为返回包含 s 和 e 列的数据框df,然后进行 ggplot 调用

ggplot(df, aes(xmin = s, xmax = e...)) + geom_rect()

推荐阅读