Проблемы, связанные с переменной в R [duplicate]

Если метод equals() присутствует в классе java.lang.Object, и ожидается, что он проверяет эквивалентность состояния объектов! Это означает, что содержимое объектов. В то время как ожидается, что оператор == проверяет, что фактические экземпляры объекта одинаковы или нет.

Пример

Рассмотрим две различные ссылочные переменные, str1 и str2:

str1 = new String("abc");
str2 = new String("abc");

Если вы используете equals()

System.out.println((str1.equals(str2))?"TRUE":"FALSE");

, вы получите выход как TRUE, если вы используете ==.

System.out.println((str1==str2) ? "TRUE" : "FALSE");

Теперь вы получите вывод FALSE в качестве вывода, потому что оба str1 и str2 указывают на два разных объекта, хотя оба они имеют одинаковое строковое содержимое. Именно из-за new String() каждый новый объект создается каждый раз.

41
задан zx8754 21 November 2017 в 10:24
поделиться

4 ответа

Вы можете искать обсуждение из ?make.names:

Синтаксически действительное имя состоит из букв, цифр и символов точки или подчеркивания и начинается с буквы или точки, не последовавшей числом. Имена, такие как «.2way», недействительны и не являются зарезервированными словами.

В самом файле справки имеется ссылка на список зарезервированных слов, которые:

, если else повторяется, пока функция для следующего разрыва

TRUE FALSE NULL Inf NaN NA NA_integer_ NA_real_ NA_complex_ NA_character _

Многие другие хорошие заметки из комментарии включают точку Джеймса в R FAQ , рассматривающую эту проблему, и указатель Джоша на связанный SO вопрос , посвященный проверке синтаксически допустимых имен.

32
ответ дан Community 16 August 2018 в 10:44
поделиться
  • 1
    Обратите внимание, что вы можете использовать что угодно, если вы укажете имя переменной, например, `` TRUE` & lt; -2`. Я не могу написать это правильно, используя синтаксис SO :( – James 8 February 2012 в 17:04
  • 2
    Конечно, моя проблема заключалась в том, что я искал Google для обратных («ограничений») или в основном недопустимых символов, когда я должен был искать символы valid . – Kyle Brandt 8 February 2012 в 17:05
  • 3
    Кроме того, точка сама по себе действительна. . = 3; print(.) – Aaron McDaid 17 September 2014 в 15:17
  • 4
    В чем смысл названия, начинающегося с точки? Я видел много в R-пакетах. – skan 14 September 2017 в 13:51
  • 5
    @skan Обычно это делается для того, чтобы избежать столкновений имен с общими именами переменных, столбцами фреймов данных или другими аргументами, передаваемыми по разным методам или другим функциям. – joran 14 September 2017 в 17:22

Почти ничего! Вы можете использовать «assign» для создания смешных имен переменных:

assign("1",99)
ls()
# [1] "1"

Да, это переменная с именем «1». Цифра 1. К счастью, это не меняет значение целого числа 1, и вам нужно немного усердно работать, чтобы получить его значение:

1
# [1] 1
get("1")
# [1] 99

. Синтаксические ограничения, о которых могут упомянуть некоторые люди, парсер. По сути, очень мало вы не можете назвать R-объектом. Вы просто не можете сделать это с помощью оператора присваивания «& lt; -». «get» освободит вас:)

20
ответ дан MichaelChirico 16 August 2018 в 10:44
поделиться
  • 1
    Я считаю, что фраза «Достаточно веревка, чтобы повесить себя». :-П – Kyle Brandt 8 February 2012 в 17:11
  • 2
    ? assign: «Нет ограничений на« имя »: это может быть несинтаксическое имя (см.« make.names »). & quot ;. Это, конечно, ложь: c = paste (rep (буквы, 10000), collapse = & quot;); assign (c, 123) производит: Ошибка в назначении (c, 123): имена переменных ограничены 10000 байтами – Spacedman 8 February 2012 в 17:12
  • 3
    @joran - из ?name, «Имена ограничены 10 000 байтами (и до 256 байт в версиях R до 2.13.0)», поэтому для вас существует хотя бы один предел! – Josh O'Brien 8 February 2012 в 17:12
  • 4
  • 5
    – Gavin Simpson 8 February 2012 в 18:46

Использование функции make.names () из встроенного базового пакета может помочь:

is_valid_name<- function(x)
{
  length_condition = if(getRversion() < "2.13.0") 256L else 10000L
  is_short_enough = nchar(x) <= length_condition
  is_valid_name = (make.names(x) == x)

  final_condition = is_short_enough && is_valid_name
  return(final_condition)
}
0
ответ дан omarflorez 16 August 2018 в 10:44
поделиться

Невозможно напрямую обратиться к вашему вопросу, но он очень помогает. Попробуйте команду exists(), чтобы узнать, существует ли что-то, и вы знаете, что вы не должны использовать системные имена для своих переменных или функций. Пример ...

   > exists('for')
   [1] TRUE

   >exists('myvariable')
   [1] FALSE
2
ответ дан Stat-R 16 August 2018 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: