【发布时间】: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