R имеет лексическую область видимости, что означает, что функции ищут переменные в среде, в которой они были определены. c2ll определен в глобальной среде, поэтому он не видит ваши определения n, sumx и sum1x внутри функции. S, с другой стороны, использует динамическую область видимости, которая ведет себя как , которую вы ожидаете (то есть ищет переменные в области действия, в которой она была вызвана). Компьютерные ученые, как правило, считают, что динамическое определение области было тупиковой плохой идеей, и что лексическое определение области - это путь.
На практике, что вы можете с этим поделать?
Ну, есть пара вариантов ...
Сначала , вы можете определить свою функцию локально:
n <- length(x)
sumlx <- sum(log(x))
sumx <- sum(x)
c2ll <- function(dfHat){
-n * log(gamma(dfHat/2)) - n * (dfHat/2) * log(2) + (dfHat/2 - 1) * sumlx - sumx/2
}
dfhat <- optimize(f=c2ll, interval=c(1, 10), maximum=TRUE)$maximum
Второй , вы можете сделать так, чтобы c2ll принял дополнительные параметры и передал эти параметры через оптимизацию.
#in global env
c2ll <- function(dfHat,n,sum1x,sumx){
-n * log(gamma(dfHat/2)) - n * (dfHat/2) * log(2) +
(dfHat/2 - 1) * sumlx - sumx/2
}
#...
#in function
n <- length(x)
sumlx <- sum(log(x))
sumx <- sum(x)
dfhat <- optimize(f=c2ll, interval=c(1, 10), n=n,sum1x=sum1x,sumx=sumx, maximum=TRUE)$maximum
Оба варианта являются чистыми и сохраняют инкапсуляцию ваших функций.