2013-05-13 13 views
6
> within(list(a="a",b="b"), c="c") 
Error in eval(expr, envir, enclos) : argument is missing, with no default 
> within(list(a="a",b="b"), c<-"c") 
$a 
[1] "a" 

$b 
[1] "b" 

$c 
[1] "c" 

Nie jestem pewien, dlaczego te dwie rzeczy nie powinny być równoważne. Wygląda na to, że wersja = zostanie zinterpretowana jako argument o nazwie c do wnętrza z powodu .... Czy istnieje sposób, aby wyłączyć to zachowanie? Spróbowałem,Dlaczego wartości = i <- nie są równoważne w ciągu()?

ale to też się nie udaje.

+1

Z tego samego powodu, że 'system.time (x = rnorm (1e300))' nie robi nie działa. –

+7

Jeśli '=' jest najwyższym wywołaniem funkcji w wyrażeniu przekazanym do funkcji, wówczas '=' jest rozumiane jako przypisanie argumentów. Porównaj z 'wewnątrz (lista (a =" a ", b =" b "), {c =" c "})' –

+0

Znak = oznacza, że ​​przypisanie jest funky wewnątrz funkcji, R się mylić, czy jest to zadanie lub argument. –

Odpowiedz

8

Masz rację, że c="c" (lub dowolna klauzula tego formularza) jest interpretowana jako dostarczony argument. I nie, nie ma sposobu, aby to wyłączyć - jest to prawdopodobnie obsługiwane na poziomie parsera R.

Różnica pomiędzy = i <- udokumentowano ?"<-"

operatorów < - 'i „=” przypisać do środowiska, w którym są oceniane. Operatora "< -" można użyć w dowolnym miejscu, , podczas gdy operator '=' jest dozwolony tylko na najwyższym poziomie (np. w pełnym wyrażeniu wpisanym w wierszu polecenia) lub jako jeden podwyrażeń na usztywnionej liście wyrażeń.

Podstawowym przykładem "usztywnionej listy wyrażeń" jest treść funkcji, którą można zweryfikować, wpisując np. is(body(plot.default)), length(body(plot.default)).

+0

Dzięki za wyjaśnienie. Za każdym razem, gdy napotykam coś takiego, myślę, że uczę się trochę więcej o tym, jak działa parser R. Teraz, gdybym tylko miał wolne lato lub dwa lub trzy, aby przejść przez źródło C i dowiedzieć się, jak to * naprawdę * działa :-) –

+0

@ AriB.Friedman - Hej, nie kusz mnie, bym rzucił okiem dla siebie! Byłem po prostu szczęśliwy, aby w końcu dowiedzieć się, co tak naprawdę robiło odniesienie do "wzmocnionych wyrażeń", i będzie to uznawać za osiągnięcie, które już się tam udało;) –

+0

Łączenie sugestii @MatthewPlourde z twoją, 'is (quote ({5^2}) 'zwraca' [1] "{" "język" 'tak jak' is (body (plot.default)) 'robi. –

3

Josh odpowiedziała "dlaczego", ale na sugestię OP, tu jest inny "jak":

within(list(a="a",b="b"), "="(c,"c")) 
# $a 
# [1] "a" 
# 
# $b 
# [1] "b" 
# 
# $c 
# [1] "c" 
Powiązane problemy