Указание имен столбцов в data.frame меняет пробелы на «.»

Семантика перемещения основана на ссылках rvalue . Rvalue - временный объект, который будет уничтожен в конце выражения. В текущем C ++ значения r привязаны только к const ссылкам. C ++ 1x позволит ссылаться на ссылки не на const rvalue, записанные T&&, которые являются ссылками на объекты rvalue. Так как rvalue будет умирать в конце выражения, вы можете украсть его данные . Вместо того, чтобы копировать в другой объект, вы переместите свои данные в него.

class X {
public: 
  X(X&& rhs) // ctor taking an rvalue reference, so-called move-ctor
    : data_()
  {
     // since 'x' is an rvalue object, we can steal its data
     this->swap(std::move(rhs));
     // this will leave rhs with the empty data
  }
  void swap(X&& rhs);
  // ... 
};

// ...

X f();

X x = f(); // f() returns result as rvalue, so this calls move-ctor

В приведенном выше коде со старыми компиляторами результат f() был скопирован в x с помощью конструктора копий X. Если ваш компилятор поддерживает перемещение семантики, а X имеет конструктор move, то вместо этого вызывается. Поскольку аргумент rhs является rvalue , мы знаем, что он больше не нужен, и мы можем украсть его значение. Таким образом, значение перемещено из неназванного временного объекта, возвращенного с f() в x (в то время как данные x, инициализированные до пустого X, перемещаются во временное, что будет уничтожить после назначения).

29
задан smci 27 June 2018 в 00:34
поделиться

3 ответа

Не знаете.

С желаемым пространством формат не будет удовлетворять требованиям к идентификатору, который вступает в силу при использовании df $ column.1 - который не может справиться с пробелом. См. Подробности или пример функции make.names () :

> make.names(c("Foo Bar", "tic tac"))
[1] "Foo.Bar" "tic.tac"  
>                                              
8
ответ дан 27 November 2019 в 21:49
поделиться

Вы можете изменить существующие имена фреймов данных, чтобы они содержали пробелы, т.е. используя ваш пример

x <- c(1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10)
df <- data.frame("Label 1"=x,"Label 2"=rnorm(100))
colnames(df) <- c("Label 1", "Label 2")
head(df, 3)

возвращает

  Label 1    Label 2
1       1  0.2013347
2       2  1.8823111
3       3 -0.5233811

, и вы по-прежнему можете получить доступ к столбцам с помощью оператора $, вам просто нужно использовать double кавычки, например,

df$"Label 2"[1:3]

возвращает

[1]  0.2013347  1.8823111 -0.5233811

Мне кажется довольно непоследовательным автоматическое преобразование имен столбцов при создании data.frame, но не делать то же самое во время изменения имени столбца, но именно так работает R в настоящий момент.

5
ответ дан 27 November 2019 в 21:49
поделиться

Вы можете установить check.names = FALSE в data.frame (а также в read.table ):

df <- data.frame("Label 1" = 1:3, "Label 2" = rnorm(3), check.names = FALSE)

возвращает:

  Label 1    Label 2
1       1  0.2013347
2       2  1.8823111
3       3 -0.5233811

From ? data.frame :

check.names
logical. Если TRUE , то имена переменных во фрейме данных проверяются, чтобы гарантировать, что они являются синтаксически допустимыми именами переменных и не дублируются. При необходимости они корректируются (с помощью make.names ) так, чтобы они были.


From ? Make.names :

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

Все недопустимые символы переводятся в «. »


Кроме того, если вам нужно задать подмножество переменной с «недопустимым» именем с помощью $ , вы можете использовать обратные кавычки `. Например:

df$`Label 1`
64
ответ дан 27 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

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