Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: do.call(fun, ...) czy do.call("fun", ...)

Której wersji lepiej używać (fun - dowolna funkcja). Zaletą pierwszej wersji jest mniej pisania :).
Maciej B.

Maciej B. Doktorant

Temat: do.call(fun, ...) czy do.call("fun", ...)

Hmm przyznam, że nie wiem na czym polega różnica. Jak wymienione zapisy wpływają działanie funkcji do.call?
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: do.call(fun, ...) czy do.call("fun", ...)

Jeżeli przypiszemy c <- 1, to wywołanie do.call(c,...) nie zadziała ale do.call("c",...) zadziała tak jak się spodziewamy czyli skorzysta z funkcji c.
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: do.call(fun, ...) czy do.call("fun", ...)

Bezpieczniej przez "fun", bo, jak sam doświadczyłeś, użycie fun najpierw patrzy w GlobalEnv i jak się trafi obiekt o tej samej nazwie, który nie jest funkcją, to dostaniemy error.

Edit: Gwoli ścisłości, to najpierw patrzy w "parent environment", którym w tym konkretnym przypadku był GlobalEnv. Można sterować argumentem 'envir' np.:


c <- 1:5
do.call(c, list(1,2))
# Error in do.call(c, list(1, 2)) :
# 'what' must be a character string or a function
do.call("c", list(1,2))
# [1] 1 2

# ciekawe, że to nie daje błędu...
do.call("c", list(1,2), envir=.GlobalEnv)
# [1] 1 2
do.call(c, list(1,2), envir=.GlobalEnv)
# Error in do.call(c, list(1, 2), envir = .GlobalEnv) :
# 'what' must be a character string or a function

# 'c' jest funkcją
c <- function(...) paste(..., collapse="|")
# użyta wersja z 'base'
do.call(c, list(1,2))
# [1] "1 2"
do.call("c", list(1,2))
# [1] "1 2"

# użyta wersja usera
do.call("c", list(1:2))
# [1] "1|2"
do.call(c, list(1:2))
# [1] "1|2"

# caly czas z GlobalEnv
do.call(c, list(1:2), env=asNamespace("base"))
# [1] "1|2"

# a tu juz "poprawnie" z 'base'
do.call("c", list(1:2), env=asNamespace("base"))
# [1] 1 2
Michał Bojanowski edytował(a) ten post dnia 19.10.12 o godzinie 09:46
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: do.call(fun, ...) czy do.call("fun", ...)

Wspomniałem o tym problemie, bo spotkałem się z opiniami, że nie trzeba używać cudzysłowów w przypadku wywoływania do.call. Jak widać nie jest to prawda i nie we wszystko co w internecie piszą trzeba wierzyć.
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: do.call(fun, ...) czy do.call("fun", ...)

Jak widać nie jest to prawda i nie we wszystko co w internecie piszą trzeba wierzyć.

:)



Wyślij zaproszenie do