2015-09-18 4 views
-1

Я только что начал изучать R с сайтом «datacamp», и в начале я столкнулся с синтаксическим недоразумением.Почему не работает rm (ls()) и «список»?

В нем говорится, что rm(list = ls()) - очень полезная команда, чтобы очистить все от вашего рабочего пространства, но я не понимаю, для чего стоит list =.

  • a. Они еще не научили меня значению = в R, и я не нашел объяснения в документации. = как <-? Какая разница?

  • b. Если ввод rm() может быть списком имен переменных, а вывод ls() - это список имен var, почему я не могу использовать rm(ls())?

+0

попробуйте 'args (rm)'. – jangorecki

+0

Помогите (rm) 'посмотреть, какие параметры' rm' принимает. 'list' - это имя одного из параметров. Вы можете предоставлять параметры для функций позиционно и/или с явными именами. Причина явного имени здесь в том, что список параметров функции начинается с '...'. Если вы не укажете один из названных параметров по имени, 'rm' не имеет представления о ваших намерениях, так как вы можете удалить любое количество отдельных объектов в среде с помощью' rm' в том же вызове. Это единственный раз (IMO), который вы должны использовать '=' при выполнении назначений параметров функции. – hrbrmstr

+0

Dupe # 1: http://stackoverflow.com/questions/1741820/assignment-operators-in-r-and –

ответ

4

Передача аргументов по позиции против имени

= символа играет особую роль в именовании аргументов вызова функции.

Рассмотрим две по существу идентичные функции:

f <- function(..., y=3) (2+sum(...))^y 
g <- function(y=3, ...) (2+sum(...))^y 

Если y= не поименован, результаты обычно являются различными:

f(y=5) # 32 
g(y=5) # 32 

f(5) # 343 
g(5) # 32 

rm, как f - тип ?rm увидеть - так что если вы хотите позвонить rm(list = ls()), напишите его полностью.

Представляющие имена объектов

В большинстве R, если вы пишете f(g()), оценка естественно вытекает:

  • g() оценивается в 8 и подставляется в f(g()) для f(8)
  • f(8) оценивается до 1000

rm разрывает этот шаблон в своих неназванных аргументах ..., которые в основном существуют только для интерактивного использования. Разрешены только введенные вручную имена переменных. В результате rm(ls()) не будет работать.

Hadley Викхам provides another nice example:

ggplot2 <- "plyr" 
library(ggplot2) # loads ggplot2, not plyr! 

† Хорошо, вы можете использовать ... без вручную типизированных имена, как

do.call(library, as.list(ggplot2)) # loads plyr! 

но не м с этим, если вы не знаете, что делаете.

+0

Заметим также, что если у вас есть 'X' и' Y' в рабочей области, с 'rm()' вы ** можете ** делать 'rm (" X "," Y ")', но вы ** не можете * * do 'rm (ls())'. Это то, что я испытываю затруднения. –

+0

@RichardScriven Да, даже если есть только 'x', например' rm (list = ls()); x = 1', вы не можете выполнить 'rm (ls())' ... Я пытаюсь придумать некоторые другие примеры с такими аномальными правилами оценки. О, вот один: 'mylib =" data.table "; библиотека (mylib) # ошибка'. Я предполагаю, что это наиболее распространено в старых базовых функциях и в хасселе. – Frank

+1

Итак, что-то происходит внутри, что делает 'rm (ls())' невозможным. Обратите внимание, что '.Internal (remove (ls(), .GlobalEnv, FALSE))' работает, а 'rm()' вызывает это в конце (для основного случая). –

Смежные вопросы