[R-br] Generalizando chamada de função

João Felipe Santos joao.eel em gmail.com
Terça Setembro 6 13:32:19 BRT 2011


Olá,

a inserção de valor padrão numa função é bastante simples: basta que
você coloque o valor que quer definir como padrão na declaração da
função.

Por exemplo (direto no console do R, por isso a marcação com > e +):

> f <- function(x, y=10) {
+ x+y
+ }
> f(10)
[1] 20
> f(1)
[1] 11
> f(10, 5)
[1] 15
>

Outro detalhe que me lembrei é que você não necessariamente precisa
fazer a sua passagem de distribuição por string, pois R aceita que se
passe uma função como parâmetro. Por exemplo (usando dpois como
distribuição padrão):

> g <- function(y, a, dist=dpois) {
+ dist(y,a)
+ }
> g(1, 10)
[1] 0.0004539993
> g(1, 10, dnorm)
[1] 1.027977e-18
>

Espero ter auxiliado.

--
João Felipe Santos



2011/9/6 . . <xkziloj em gmail.com>:
> Muito obrigado J F Santos. Não fiz exatamente como o seu código mas
> acho que a ideia é a mesma, certo? ("func41")
>
> Agora tenho outra dúvida, é com relação ao parâmetro "rate" da função
> "dexp" (chamada pela "RegDist"), esse parâmetro já tem um valor
> padrão. Tentei incluir essa funcionalidade no meu código - "func42",
> mas não compreendi por completo como utilizar "..." neste caso.
>
> Poderia me ajudar, por favor.
>
> func41 <- function(y, a, sad, rate) {
>        Compound <- function(n, y, a, sad, samp, rate) {
>                RegDist <- function(n, sad, rate) {
>                        dcom <- paste("d", sad, sep="")
>                        dots <- list(n, rate)
>                        do.call(dcom, dots)
>                }
>                RegDist(n, sad, rate) * dpois(y, a * n)
>        }
>        integrate(Compound, 0, Inf, y, a, sad, samp, rate)$value
> }
>
> func41(1, 0.05, "exp", rate=0.001)
>
> func42 <- function(y, a, sad, ...) {
>        dots <- list(...)
>        Compound <- function(n, y, a, sad, dots) {
>                RegDist <- function(n, sad, dots) {
>                        dcom <- paste("d", sad, sep="")
>                        dots <- list(n, dots)
>                        do.call(dcom, dots)
>                }
>                RegDist(n, sad, dots) * dpois(y, a * n)
>        }
>        integrate(Compound, 0, Inf, y, a, sad, dots)$value
> }
>
> func42(1, 0.05, "exp", rate=0.001)
>
>
> 2011/9/6 João Felipe Santos <joao.eel em gmail.com>:
>> Olá,
>>
>> o erro ocorre ao fazer a composição as.list(c(y, lambda)). Você gera
>> uma única lista contendo como valores o conteúdo do vetor composto por
>> y E lambda. Substitua a func2 pela seguinte:
>>
>> func2 <- function(y, a, rate, samp) {
>>       f1 <- function(n, y, a, rate, samp) {
>>
>>               SampDist <- function(y, a, n, samp) {
>>                       lambda <- a * n
>>                       dcom <- paste("d", samp, sep="")
>>                       do.call(dcom, list(x=y, lambda=lambda))
>>               }
>>
>>               dexp(n, rate) * SampDist(y, a, n, samp)
>>       }
>>       integrate(f1, 0, Inf, y, a, rate, samp)
>> }
>>
>> Vai funcionar como você espera.
>>
>> []s
>>
>> --
>> João Felipe Santos
>>
>> 2011/9/6 . . <xkziloj em gmail.com>:
>>> Olá pessoal,
>>>
>>> Gostaria da ajuda de vcs para entender o que acontece no código da
>>> "func2". Meu plano é fazer com que func2 e func1 retornem os mesmos
>>> valores. Para "func1" obtenho...
>>>
>>> 0.25 with absolute error < 8.4e-05
>>>
>>> Mas "func2" está retornando...
>>>
>>> Error in dpois(1, 0.1, 23.3065168689948, 0.000429064542600244,
>>> 3.82988398013855,  :
>>>  unused argument(s) (0.000429064542600244, 3.82988398013855,
>>> 0.00261104515224461, 1.37999516465199, 0.0072464022020844,
>>> 0.673787740945863, 0.0148414691931943, 0.383193602946711,
>>> 0.0260964690514175, 0.236612585866545, 0.0422631787036055,
>>> 0.152456705113438, 0.0655923922306948)
>>>
>>>
>>> func1 <- function(y, a, rate) {
>>>        f1 <- function(n, y, a, rate) {
>>>                lambda <- a * n
>>>                dexp(n, rate) * dpois(y, lambda)
>>>        }
>>>        integrate(f1, 0, Inf, y, a, rate)
>>> }
>>>
>>> func1(1, 0.1, 0.1)
>>>
>>>
>>> func2 <- function(y, a, rate, samp) {
>>>        f1 <- function(n, y, a, rate, samp) {
>>>
>>>                SampDist <- function(y, a, n, samp) {
>>>                        lambda <- a * n
>>>                        dcom <- paste("d", samp, sep="")
>>>                        dots <- as.list(c(y, lambda))
>>>                        do.call(dcom, dots)
>>>                }
>>>
>>>                dexp(n, rate) * SampDist(y, a, n, samp)
>>>        }
>>>        integrate(f1, 0, Inf, y, a, rate, samp)
>>> }
>>>
>>> func2(1, 0.1, 0.1, "pois")
>>>
>>>
>>>
>>> Desde já obrigado.
>>> _______________________________________________
>>> R-br mailing list
>>> R-br em listas.c3sl.ufpr.br
>>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
>>>
>> _______________________________________________
>> R-br mailing list
>> R-br em listas.c3sl.ufpr.br
>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
>>
>


Mais detalhes sobre a lista de discussão R-br