ObjC: запустить непрерывный цикл с CFRunloop или отправить [duplicate]

Мы можем использовать data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(df1)), сгруппированные по 'ID', получите индекс строки (.I), где число уникальных «Месяцев» равно числу уникальных ' Месяцы во всем наборе данных и подмножество данных на основе этого

library(data.table)
setDT(df1)[df1[, .I[uniqueN(Month) == uniqueN(df1$Month)], ID]$V1]
#    ID Month
# 1:  4   Jan
# 2:  4   Feb
# 3:  4   Mar
# 4:  4   Apr
# 5:  4   May
# 6:  4   Jun
# 7:  6   Jan
# 8:  6   Jan
# 9:  6   Feb
#10:  6   Mar
#11:  6   Apr
#12:  6   May
#13:  6   Jun

Чтобы извлечь 'ID

setDT(df1)[, ID[uniqueN(Month) == uniqueN(df1$Month)], ID]$V1
#[1] 4 6

Или с помощью base R

1) Использование table с rowSums

v1 <- rowSums(table(df1) > 0)
names(v1)[v1==max(v1)]
#[1] "4" "6"

Эта информация может использоваться для подмножества данных

subset(df1, ID %in% names(v1)[v1 == max(v1)])

2) Используя tapply

lst <- with(df1, tapply(Month, ID, FUN = unique))
names(which(lengths(lst) == length(unique(df1$Month))))
#[1] "4" "6"

Или используя dplyr

library(dplyr)
df1 %>%
     group_by(ID) %>%
     filter(n_distinct(Month)== n_distinct(df1$Month)) %>%
     .$ID %>%
     unique
#[1] 4 6

или если нам нужно получить строки

df1 %>%
     group_by(ID) %>%
     filter(n_distinct(Month)== n_distinct(df1$Month))
# A tibble: 13 x 2
# Groups:   ID [2]
#      ID Month
#   <int> <chr>
# 1     4   Jan
# 2     6   Jan
# 3     6   Jan
# 4     4   Feb
# 5     6   Feb
# 6     4   Mar
# 7     6   Mar
# 8     4   Apr
# 9     6   Apr
#10     4   May
#11     6   May
#12     4   Jun
#13     6   Jun
19
задан Jon Gauthier 22 May 2013 в 05:37
поделиться

6 ответов

Да; вы можете написать свой собственный основной метод и запустить NSRunLoop, не возвращаясь из NSApplicationMain.

Посмотрите на эту ссылку ; этот парень использует NSRunLoop в своем основном методе, но он не загружает файлы NIB, но он должен заставить вас идти с NSRunloops.

11
ответ дан vike 3 September 2018 в 13:10
поделиться

Решение заключается в вызове NSApplication вручную. Сначала создайте делегат приложения, чем замените вызов NSApplicationMain () в main.m следующим образом:

AppDelegate * delegate = [[AppDelegate alloc] init];

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSApplication * application = [NSApplication sharedApplication];
[application setDelegate:delegate];
[NSApp run];

[pool drain];

[delegate release];

Делегат будет вызываться, когда он готов, без необходимости использовать nib

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
14
ответ дан Ben Reeves 3 September 2018 в 13:10
поделиться

В Swift вы можете достичь этого, добавив следующую строку в конец вашего main.swift:

NSRunLoop.currentRunLoop().run();  // Swift < 3.0
RunLoop.current.run();             // Swift >= 3.0

. Если вы хотите остановить цикл выполнения, вы должны использовать Core Foundation.

CFRunLoopRun(); // start

И вы можете остановить его так

CFRunLoopStop(CFRunLoopGetCurrent()); // stop
13
ответ дан Chad Scira 3 September 2018 в 13:10
поделиться

Следуйте рекомендациям в документах для [NSRunLoop run]:

BOOL shouldKeepRunning = YES;        // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate     distantFuture]]);
6
ответ дан Chris 3 September 2018 в 13:10
поделиться

Посмотрите на asynctask.m, который запускает NSRunLoop вручную, чтобы включить использование асинхронных уведомлений waitForDataInBackgroundAndNotify.

http://www.cocoadev.com/index.pl? NSPipe

  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

   while(!terminated) 
   {
     //if (![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100000]])
     if (![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) 
     {
         break;
     }
      [pool release];
      pool = [[NSAutoreleasePool alloc] init];
   }

   [pool release];
5
ответ дан Parag Bafna 3 September 2018 в 13:10
поделиться
// Yes.  Here is sample code (tested on OS X 10.8.4, command-line).
// Using ARC:
// $ cc -o timer timer.m -fobjc-arc -framework Foundation
// $ ./timer
//

#include <Foundation/Foundation.h>

@interface MyClass : NSObject
@property NSTimer *timer;
-(id)init;
-(void)onTick:(NSTimer *)aTimer;
@end

@implementation MyClass
-(id)init {
    id newInstance = [super init];
    if (newInstance) {
        NSLog(@"Creating timer...");
        _timer = [NSTimer scheduledTimerWithTimeInterval:1.0
            target:self
            selector:@selector(onTick:)
            userInfo:nil
            repeats:YES];
    }
    return newInstance;
}

-(void)onTick:(NSTimer *)aTimer {
    NSLog(@"Tick");
}
@end

int main() {
    @autoreleasepool {
        MyClass *obj = [[MyClass alloc] init];
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}
8
ответ дан rmcghee 3 September 2018 в 13:10
поделиться
Другие вопросы по тегам:

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