Существует метод data.table для внутреннего соединения, который очень эффективен для времени и памяти (и необходим для некоторых более крупных data.frames):
library(data.table)
dt1 <- data.table(df1, key = "CustomerId")
dt2 <- data.table(df2, key = "CustomerId")
joined.dt1.dt.2 <- dt1[dt2]
merge
также работает с данными .tables (поскольку он является общим и вызывает merge.data.table
)
merge(dt1, dt2)
data.table, зарегистрированный в stackoverflow: Как выполнить операцию слияния данных.table Перевод SQL присоединяется к внешним ключам к синтаксису R data.table . Эффективные альтернативы слиянию для больших данных. Кадры R Как сделать базовое левое внешнее соединение с data.table в R?
Еще одна опция - функция join
, найденная в пакете plyr
library(plyr)
join(df1, df2,
type = "inner")
# CustomerId Product State
# 1 2 Toaster Alabama
# 2 4 Radio Alabama
# 3 6 Radio Ohio
Опции для type
: inner
, left
, right
, full
.
Из ?join
: В отличие от merge
, [join
] сохраняет порядок x независимо от того, какой тип соединения используется.
Из документации QMenu:
Существует четыре типа элементов действия: разделители, действия, которые показывают подменю, виджеты и действия, выполняющие действие. Сепараторы вставлены с помощью addSeparator (), подменю с addMenu (), а все остальные элементы считаются элементами действия.
blockquote>Это звонит: Виджеты! Вы можете добавить виджет в меню? Это означает, что вы улажены, вы можете делать все, что хотите.
Что вам нужно, это объект QWidgetAction . Он позволяет вставлять пользовательский виджет в качестве действия. Вашими заголовками будут пользовательские виджеты. Если вам нужен только заголовок, достаточно
QLabel
:QMenu* myMenu = new QMenu(...); QLabel* label = new QLabel(tr("<b>Title</b>"), this); label->setAlignment(Qt::AlignCenter); QWidgetAction* a = new QWidgetAction(myMenu); a->setDefaultWidget(label);
См. Этот связанный вопрос для получения дополнительной информации сложный пример кода: Есть ли способ добавить виджет в QMenu в QtCreator
Для Qt 5.1 и выше вы должны использовать addSection(const QString &)
. Он разработан именно для того, что вы пытаетесь сделать. Решения на основе виджетов будут выглядеть странно, если вы не проявите особой осторожности при сопоставлении шрифтов и интервала и т. Д.
Для Qt 4 вы должны использовать addAction(const QString &)
как резервную копию, если вы действительно собираетесь компилировать код с Qt 4. Я думаю, что это разумный компромисс.
Для Qt 5.0 - ну, вы больше не должны его использовать, это так просто:)
-style fusion
), отображаются тексты разделителей.
– Martin Hennings
15 October 2014 в 13:07
Для всплывающего меню вы можете создать свой собственный QWidgetAction для добавления во всплывающее меню.
Это пример QWidgetAction:
#include <QWidgetAction>
class myCustomWidgetAction: public QWidgetAction
{
Q_OBJECT
public:
explicit myCustomWidgetAction(QWidget * parent);
protected:
QWidget * createWidget(QWidget *parent);
};
myCustomWidgetAction::myCustomWidgetAction(QWidget * parent):QWidgetAction(parent) {
}
QWidget * myCustomWidgetAction::createWidget(QWidget *parent){
myCustomWidget * widget=new myCustomWidget(parent);
return widget;
}
Затем вы можете добавить свой виджет в toolButton, который будет отображаться в всплывающем меню:
myCustomWidgetAction * widgetAction = new myCustomWidgetAction(this);
ui->toolButton->addAction(widgetAction);
. Пользовательский виджет может быть списком, содержащим разные элементы, или может быть любым другим виджетам. Вы также можете добавить несколько экземпляров myCustomWidgetAction в toolbutton.
Вы также можете добавить его в QMenu, например:
QMenu* menu = new QMenu();
menu->addAction(widgetAction);