Вы можете использовать dplyr
для этого:
library(dplyr)
df = data.frame(
user = c("a", "a", "b", "b", "c"),
v1 = c(1, 1, 1, 2, 1),
v2 = c(0, 0, 0, 0, 1),
v3 = c(0, 1, 0, 3, 1))
group_by(df, user) %>%
summarize(v1_sum = sum(v1),
v2_sum = sum(v2),
v3_sum = sum(v3))
Если вы не знакомы с нотой %>%
, это в основном как трубопровод от bash. Он выводит результат из group_by()
и помещает его в summarize()
. То же самое можно было бы сделать так:
by_user = group_by(df, user)
df_summarized = summarize(by_user,
v1_sum = sum(v1),
v2_sum = sum(v2),
v3_sum = sum(v3))
Короче говоря, Вы не предназначены, чтобы сделать это - но для отладки целей...
событие часто поддержано частным полем - но не со средствами управления; они используют эти EventHandlerList
подход. Необходимо было бы получить доступ к форме, защитил Events
участник, ища объект, отображенный на (частном) объекте EVENT_FORMCLOSING.
, Как только Вы имеете FormClosingEventHandler
, GetInvocationList
, должен сделать задание.
using System;
using System.ComponentModel;
using System.Reflection;
using System.Windows.Forms;
class MyForm : Form
{
public MyForm()
{ // assume we don't know this...
Name = "My Form";
FormClosing += Foo;
FormClosing += Bar;
}
void Foo(object sender, FormClosingEventArgs e) { }
void Bar(object sender, FormClosingEventArgs e) { }
static void Main()
{
Form form = new MyForm();
EventHandlerList events = (EventHandlerList)typeof(Component)
.GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(form, null);
object key = typeof(Form)
.GetField("EVENT_FORMCLOSING", BindingFlags.NonPublic | BindingFlags.Static)
.GetValue(null);
Delegate handlers = events[key];
foreach (Delegate handler in handlers.GetInvocationList())
{
MethodInfo method = handler.Method;
string name = handler.Target == null ? "" : handler.Target.ToString();
if (handler.Target is Control) name = ((Control)handler.Target).Name;
Console.WriteLine(name + "; " + method.DeclaringType.Name + "." + method.Name);
}
}
}
Проблема может заключаться в том, что форма не проверяется.
Событие FormClosing
вызывается частным методом WmClose
в ] Форма
, которая инициализирует e.Cancel
в ! Validate (true)
. Я не исследовал, но в определенных обстоятельствах Validate
всегда будет возвращать false
, в результате чего закрытие будет отменено независимо от каких-либо обработчиков событий.
Чтобы исследовать это, включите .Net отладка исходного кода , установите точку останова в обработчике FormClosing
, перейдите к источнику для Form.WmClose
(вверх по стеку вызовов), установите точку останова в начало WmClose
и снова закройте форму. Затем, пройдите через это в отладчике и посмотрите, почему Validate
возвращает false
. (Или какой обработчик событий устанавливает для e.Cancel
значение true)
Чтобы решить проблему, установите для e.Cancel
значение false
в собственном обработчике.