Решение
Вот как это можно исправить без объяснения.
Создание воспроизводимого примера:
alcohol.list <- list("1"=c(14.2, 13.2),
"2"=c(12.3, 12.3),
"3"=c(12.8, 12.9))
alcohol.list
Ваша нетронутая oneway
функция:
oneway <- function(z)
{
ni <- sapply(z, length)
yi_bar <- sapply(z, mean)
s2i <- sapply(z, sd)
Y_bar <- mean(unlist(z))
g <- length(z)
N <-length(unlist(z))
Within_SS = sum((ni-1) * s2i^2)
Between_SS = sum(ni *((yi_bar)-(Y_bar))^2)
DF_Within = (N - g)
DF_Between = (g - 1)
list("WithinSS" = Within_SS, "BetweenSS"= Between_SS, "DFWithin" = DF_Within, "DFBetween" = DF_Between)
}
alcohol.aov <- oneway(alcohol.list)
Наконец, ваш oneway.table
с p.value
:
oneway.table <- function(z)
{
Mean_SSW <- z$WithinSS/z$DFWithin
Mean_SSB <- z$BetweenSS/z$DFBetween
F_value <- (Mean_SSB/Mean_SSW)
P_value <- pf(F_value, z$DFBetween, z$DFWithin, lower.tail = FALSE)
anova <- matrix(c(z[[4]], z[[3]], z[[2]], z[[1]], Mean_SSB, Mean_SSW, F_value, NA, P_value, NA), ncol =5)
dimnames(anova) <- list("Group" = c("cultivar", "Residuals"), "ANOVA" = c("DF", "Sum_Sq", "Mean_Sq", "F_value", "P_value"))
printCoefmat(anova, signif.stars = TRUE, has.Pvalue = TRUE, digits = 3, na.print="")
}
oneway.table(alcohol.aov)
Возвращает:
DF Sum_Sq Mean_Sq F_value P_value
cultivar 2.000 1.990 0.995 5.91 0.091 .
Residuals 3.000 0.505 0.168
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Объяснение
В следующем коде DF_Between
не был создан до вызова метода pf()
. На самом деле DF_Within
также не был создан и не существует в этой области.
Это может работать, например:
# create DF_Between and DF_Within first and pass in all three as arguments
oneway.table <- function(z, DF_Between, DF_Within){
Mean_SSW <- z[[1]]/z[[3]]
Mean_SSB <- z[[2]]/z[[4]]
F_value <- (Mean_SSB/Mean_SSW)
P_value <- pf(F_value, DF_Between, DF_Within, lower.tail = FALSE)
...
}
Это также может работать:
oneway.table <- function(z){
Mean_SSW <- z[[1]]/z[[3]]
Mean_SSB <- z[[2]]/z[[4]]
F_value <- (Mean_SSB/Mean_SSW)
# provided that z is a list with the two elements
P_value <- pf(F_value, z$DF_Between, z$DF_Within, lower.tail = FALSE)
...
}
Это также работает:
oneway.table <- function(z){
Mean_SSW <- z[[1]]/z[[3]]
Mean_SSB <- z[[2]]/z[[4]]
F_value <- (Mean_SSB/Mean_SSW)
# create DF_Between and DF_Within directly in here
g <- length(z)
N <-length(unlist(z))
DF_Within <- (N - g)
DF_Between <- (g - 1)
P_value <- pf(F_value, DF_Between, DF_Within, lower.tail = FALSE)
...
}
В зависимости от способаВы выбрали, вам просто нужно понять лексические рамки правила, которые использует R. Спасая вас от длинного и утомительного объяснения, вот как это происходит:
Процесс поиска , который происходит , выглядит следующим образом:
- Если значениеЕсли символ не найден в среде, в которой была определена функция, то поиск продолжается в родительской среде.
- Поиск продолжается в последовательности родительских сред, пока мы не достигнем среды верхнего уровня;обычно это глобальная среда (рабочее пространство) или пространство имен пакета.
- После среды верхнего уровня поиск продолжается вниз по списку поиска, пока мы не попадем в пустую среду.
В среде вашего локального компьютера сначала выполняется поискдля DF_Between
и DF_Within
в среде, в которой была определена эта функция, oneway.table
. Там он не был найден, поэтому в родительской среде ищутся DF_Between
и DF_Within
, и там он также не был найден, и он попадает в пустую среду.
Но в вашем кластере он сначала ищет DF_Between
и DF_Within
в среде, в которой была определена эта функция, oneway.table
. Там он не был найден, поэтому DF_Between
и DF_Within
ищутся в родительской среде, и там он был найден. Так что никаких ошибок или исключений не возникло.
Вы можете подтвердить это, запустив ls()
, чтобы напечатать и убедиться, что DF_Within
и DF_Between
действительно существовали в родительской среде в кластере, а не на локальном компьютере. ,