【问题标题】:How to fix 'Replacement has [x] rows, data has [y]' error within custom ggplot2 function? [closed]如何修复自定义ggplot2函数中的“替换有[x]行,数据有[y]”错误? [关闭]
【发布时间】:2019-10-10 09:50:57
【问题描述】:

问题

我正在创建一个函数来使用 ggplot2 制作漂亮的小提琴图,该函数还提供均值、95% 引导置信区间和组比较。当我在函数中使用变量的确切名称时,它可以工作。当我使用不同的名称时,我会得到著名的“替换有 [x] 行,数据有 [y]”错误。

假设

我知道这个错误通常是因为使用了不存在的对象而出现的。因此,我怀疑这与不同级别的局部和全局变量/环境有关,特别是与我的函数中似乎不接受不同命名参数的 rcompanion::dataSummary 函数(对于 95% CI)有关,但我被卡住了,无法弄清楚。

代码和最小可重复性示例

我的自定义函数:

# Nice Violin Plot Function
niceViolin <- function (Data=Data,Group=Group,Response=Response,ManualColour=F,ylabel,compare=F,comp1=NULL,comp2=NULL) {
  class(Data$Response) <- "numeric"
  if(!require(rcompanion)){install.packages("rcompanion") + library(rcompanion)}
  dataSummary <- groupwiseMean(Response ~ Group, 
                               data   = Data, 
                               conf   = 0.95, 
                               digits = 3,
                               R      = 2000,
                               boot        = TRUE,
                               traditional = FALSE,
                               normal      = FALSE,
                               basic       = FALSE,
                               percentile  = FALSE,
                               bca         = TRUE)
  if(!require(ggplot2)){install.packages("ggplot2") + library(ggplot2)}
  if(!require(ggsignif)){install.packages("ggsignif") + library(ggsignif)}
  ggplot(Data, aes(x = factor(Group), y = Response, fill = factor(Group))) + 
    theme_grey(base_size = 24) +
    {if (ManualColour == TRUE) scale_fill_manual(values=c("#00BA38", "#619CFF", "#F8766D"))} +
    ylab(ylabel) +
    geom_violin() +
    geom_point(aes(y = dataSummary$Mean), color = "black", size = 4, data = dataSummary) + 
    geom_errorbar(aes(y = dataSummary$Mean, ymin = dataSummary$Bca.lower, ymax = dataSummary$Bca.upper),
                  color = "black", size = 0.5, width = 0.2, data = dataSummary) + 
    theme(legend.position = "none", axis.title.x=element_blank(),
          axis.text.x = element_text(colour="black"), axis.text.y = element_text(colour="black")) +
    if (compare == TRUE) {geom_signif(comparisons = list(c(comp1, comp2)), 
                                      map_signif_level=TRUE, size= 1.3, textsize=8)
    }
}

如果我将变量命名为“组”和“响应”,它会起作用。

Response <- sample(x = 1:20, size = 50, replace = TRUE)
Group <- sample(x = 1:2, size = 50, replace = TRUE)
Dataset <- data.frame(Group,Response)
niceViolin(Data = Dataset, Group = Group, Response = Response, ManualColour = F, ylabel = "Dependent Variable", compare = T, comp1 = 1, comp2 = 2)

如果我将列名命名为其他名称,则不起作用。

# If I name my column names something else, it doesn't work.
names(Dataset) <- c("Condition","Outcome")
niceViolin(Data = Dataset, Group = Condition, Response = Outcome, ManualColour = F, ylabel = "Dependent Variable", compare = T, comp1 = 1, comp2 = 2)
 Error in `$<-.data.frame`(`*tmp*`, "Response", value = numeric(0)) : 
  replacement has 0 rows, data has 50 

问题

我希望当我的列名与我的函数默认值不同时,它仍然可以工作。知道为什么不是这种情况,以及如何解决这个问题吗?

【问题讨论】:

  • 在 niceViolin 函数的第二行中,您尝试访问 Data$Response,但传递给函数的数据帧没有变量“Response”——只有 Outcome。您还将在 ggplot 语句中遇到问题,在该语句中再次传递 Data 数据框,并尝试在那里引用 Group 和 Response 变量。部分问题是将整个数据帧(Data)以及 Group 和 Response 向量分别传递给函数
  • 由于“无法再复制的问题或简单的印刷错误”,此问题已作为题外话关闭。示例代码仍然适用于我,但我怀疑它可能不适用于尚未安装所需软件包的人。因此,我稍微编辑了代码以安装必要的包,如果在尝试示例代码时没有安装它们。它现在应该可以工作了。

标签: r function ggplot2 environment-variables


【解决方案1】:

您不需要单独传递整个数据框和向量(请参阅上面的评论)。如果您想灵活使用变量名称,解决此问题的最快方法可能是:

niceViolin <- function (Group, Response, ManualColour=F, ylabel, compare=F, comp1=NULL, comp2=NULL) {
  Data <- data.frame(Group, Response)

然后调用函数如下:

niceViolin(Group = Dataset$Condition, Response = Dataset$Outcome, ManualColour = F, ylabel = "Dependent Variable", compare = T, comp1 = 1, comp2 = 2)

【讨论】:

  • 那么我认为我们同意“[x] 行”错误不是罪魁祸首。我想重新命名我的帖子,以更好地传达您的解决方案已解决的问题,但我想不出好的和清晰的东西。你会用什么标题用几句话来表达这个问题?
  • hmmm...可能与将整个数据帧与特定列向量作为参数传递给自定义函数有关...
猜你喜欢
  • 2015-07-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多