lem-usp / EvolQG

Tools for Evolutionary Quantitative Genetics
http://cran.r-project.org/web/packages/evolqg/
Other
10 stars 8 forks source link

KrzCor versus KrzCor.default #25

Closed alexhubbe closed 10 years ago

alexhubbe commented 10 years ago

Caro,

olha eu enchendo novamente!!

quando vc carrega o Morphometrics no RStudio, aparece tanto KrzCor quanto KrzCor.default e KrzProjection e KrzProjection.default, mas os que são .default não funcionam (Error: could not find function "KrzCor.default") e o help deles é igual... quando vc entra em https://github.com/lem-usp/Morphometrics/tree/master/R as opções .default não aparecem...

diogro commented 10 years ago

Várias das funções de comparação de matrizes agora são "genéricas", ou seja, elas não são efetivamente as funções que fazem a conta. Em vez disso, elas chamam uma outra função, chamada um "método", que contem o código a ser executado. Uma função genérica pode ter vários métodos, dependendo do tipo da variável de entrada. Vc pode ver o código da função genérica digitando o nome dela sem parenteses:

> KrzCor
function (cov.x, cov.y, ...) 
UseMethod("KrzCor")
<environment: namespace:Morphometrics>

(é só isso mesmo o código... hehehehe)

No caso das funções de comparação, existem dois métodos: um padrão e um para listas. Você pode verificar isso diretamente usando a função methods:

> methods(KrzCor)
[1] KrzCor.default* KrzCor.list*   

   Non-visible functions are asterisked

Note que essas funções são "não visíveis", ou seja, não podem ser acessadas diretamente pelo usuário. Somente a função genérica pode ser usada, e qual método vai ser invocado fica por conta do R.

Se você quiser acessar o código de algum método que não seja visível, precisa de um função especifica pra isso, a getS3method do pacote uitls:

> library(utils)
> getS3method("KrzCor", "default")
function (cov.x, cov.y, ret.dim = NULL, ...) 
{
    if (is.null(ret.dim)) 
        ret.dim = round(dim(cov.x)[1]/2 - 1)
    EigenVectors <- function(x) return(eigen(x)$vectors[, 1:ret.dim])
    A <- EigenVectors(cov.x)
    B <- EigenVectors(cov.y)
    S <- t(A) %*% B %*% t(B) %*% A
    SL <- sum(eigen(S)$values)/ret.dim
    return(SL)
}
<environment: namespace:Morphometrics>

e, para listas:

> getS3method("KrzCor", "list")
function (cov.x, cov.y = NULL, ret.dim = NULL, repeat.vector = NULL, 
    num.cores = 1, ...) 
{
    if (is.null(cov.y)) {
        out <- ComparisonMap(cov.x, function(x, y) return(c(KrzCor.default(x, 
            y, ret.dim), NA)), repeat.vector = repeat.vector, 
            num.cores = num.cores)
        out <- out[[1]]
    }
    else {
        out <- SingleComparisonMap(cov.x, cov.y, function(x, 
            y) return(c(KrzCor.default(x, y, ret.dim), NA)), 
            num.cores = num.cores)
        out <- out[, -length(out)]
    }
    return(out)
}
<environment: namespace:Morphometrics>
alexhubbe commented 10 years ago

hummmm... tendi!