Семантика перемещения основана на ссылках 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
, перемещаются во временное, что будет уничтожить после назначения).
Не знаете.
С желаемым пространством формат не будет удовлетворять требованиям к идентификатору, который вступает в силу при использовании df $ column.1
- который не может справиться с пробелом. См. Подробности или пример функции make.names ()
:
> make.names(c("Foo Bar", "tic tac"))
[1] "Foo.Bar" "tic.tac"
>
Вы можете изменить существующие имена фреймов данных, чтобы они содержали пробелы, т.е. используя ваш пример
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 в настоящий момент.
Вы можете установить 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`