Как считать ИСТИННЫЕ значения в логическом векторе

Вы можете сделать это двумя способами:

  • сохранить список состояний редактора и указатель в списке; undo перемещает указатель назад и восстанавливает состояние там, redo движется вперед вместо этого, делая что-то, отбрасывает все, кроме указателя, и вставляет состояние как новый верхний элемент;
  • не сохраняет состояния, а действия, которые требует, чтобы для каждого действия у вас было противодействие, чтобы отменить действие этого действия.

В моем (диаграммном) редакторе есть четыре уровня изменений состояния:

  • : это часть более крупного действия, а не отдельно отменяемая или повторная (например, перемещение мыши)
  • действия: один или несколько фрагментов действия, которые образуют значимые изменения, которые могут быть отменены или переделаны, но которые не отражаются в отредактированном документе, как измененный на диске (например, выбор элементов)
  • изменения документа: одно или несколько действий, которые изменяют отредактированный документ, поскольку он будет сохранен на диске (например, изменение, добавление или удаление элементов)
  • документ сохраняет: текущее состояние документа явно сохраняется на диске - на данный момент мой редактор отбрасывает историю отмены, поэтому вы не можете отменить сохранение
145
задан Henrik 26 February 2016 в 21:15
поделиться

5 ответов

@implementation TestClass

- (void) dealloc
{
    // If you don't remove yourself as an observer, the Notification Center
    // will continue to try and send notification objects to the deallocated
    // object.
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

- (id) init
{
    self = [super init];
    if (!self) return nil;

    // Add this instance of TestClass as an observer of the TestNotification.
    // We tell the notification center to inform us of "TestNotification"
    // notifications using the receiveTestNotification: selector. By
    // specifying object:nil, we tell the notification center that we are not
    // interested in who posted the notification. If you provided an actual
    // object rather than nil, the notification center will only notify you
    // when the notification was posted by that particular object.

    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(receiveTestNotification:) 
        name:@"TestNotification"
        object:nil];

    return self;
}

- (void) receiveTestNotification:(NSNotification *) notification
{
    // [notification name] should always be @"TestNotification"
    // unless you use this method for observation of other notifications
    // as well.

    if ([[notification name] isEqualToString:@"TestNotification"])
        NSLog (@"Successfully received the test notification!");
}

@end

... где-то еще в другом классе...

- (void) someMethod
{

    // All instances of TestClass will be notified
    [[NSNotificationCenter defaultCenter] 
        postNotificationName:@"TestNotification" 
        object:self];

}
-121--1783900-

Основная проблема заключается в том, что вы не знаете, в какой кодировке находятся ваши данные. Если мы полагаем, что вы правы в том, что ваш файл в конечном итоге находится в Mac OS Roman, то вам нужно сначала декодировать данные в Юникод, а затем кодировать его как iso-8859-1.

inputFile = open("input.rtf", "rb") # The b flag is just a marker in Python 2.
data = inputFile.read().decode('mac_roman')
textData = yourparsefunctionhere(data)

outputFile = open( "textbase.tab", "wb" ) # don't use file()
for k, v in textData.iteritems():
    complete_line = k + '~~~~~' + v + '~~~~~' + " ENDOFTHELINE"
    outputFile.write((complete_line + "\n").encode("iso-8859-1"))
    outputFile.close()

Но я не удивлюсь, так как это RTF, если это кодировка Windows, так что вы можете попробовать это тоже. Я не знаю, как RTF определяет кодировку.

-121--4268504-

Существуют некоторые проблемы, когда логический вектор содержит значения NA .
Смотрите, например:

z <- c(TRUE, FALSE, NA)
sum(z) # gives you NA
table(z)["TRUE"] # gives you 1
length(z[z == TRUE]) # f3lix answer, gives you 2 (because NA indexing returns values)

Поэтому я думаю, что наиболее безопасным является использование na.rm = TRUE :

sum(z, na.rm = TRUE) # best way to count TRUE values

(что дает 1). Думаю, что решение table менее эффективно (посмотрите на код функции table ).

Также следует быть осторожными с решением «table», если в логическом векторе нет значений TRUE. Предположим, что z < - c (NA, FALSE, NA) или просто z < - c (FALSE, FALSE) , то таблица (z) [«TRUE»] дает вам NA для обоих случаев.

161
ответ дан 23 November 2019 в 22:15
поделиться

Другой способ -

> length(z[z==TRUE])
[1] 498

Хотя sum (z) красивый и короткий, для меня length (z [z == ИСТИНА]) более понятен. Хотя я думаю, что с такой простой задачей, как эта, на самом деле это не имеет значения ...

Если это большой вектор, вы, вероятно, должны выбрать самое быстрое решение, которым является sum (z) . length (z [z == TRUE]) примерно в 10 раз медленнее, а table (z) [TRUE] примерно в 200 раз медленнее, чем sum (z) .

Подводя итог, можно сказать, что sum (z) является самым быстрым для ввода и выполнения.

11
ответ дан 23 November 2019 в 22:15
поделиться

Другим вариантом, который не был упомянут, является использование , который :

length(which(z))

просто для фактического обеспечения некоторого контекста на «который является быстрее вопросов», Всегда проще всего просто проверить себя. Я сделал вектор намного больше для сравнения:

z <- sample(c(TRUE,FALSE),1000000,rep=TRUE)
system.time(sum(z))
   user  system elapsed 
   0.03    0.00    0.03
system.time(length(z[z==TRUE]))
   user  system elapsed 
   0.75    0.07    0.83 
system.time(length(which(z)))
   user  system elapsed 
   1.34    0.28    1.64 
system.time(table(z)["TRUE"])
   user  system elapsed 
  10.62    0.52   11.19 

так четко с использованием SUM - лучший подход в этом случае. Вы также можете захотеть проверить ценности , как предложил Марек.

Просто добавить примечание, касающуюся значений Na и функцию , в котором функция:

> which(c(T, F, NA, NULL, T, F))
[1] 1 4
> which(!c(T, F, NA, NULL, T, F))
[1] 2 5

Обратите внимание, что только проверяет логику True так

84
ответ дан 23 November 2019 в 22:15
поделиться

Вот как вы преобразуете числа в последовательности и соединяете последовательности с другими вещами (это странно):

>> ['the number is ' num2str(15) '.']
ans =
the number is 15.
-121--2774022-

Это не builtin, но альтернатива я предпочитаю использовать классы типов, чтобы обобщить Булевы операции предикатам любой арности:

module Pred2 where

class Predicate a where
  complement :: a -> a
  disjoin    :: a -> a -> a
  conjoin    :: a -> a -> a

instance Predicate Bool where
  complement = not
  disjoin    = (||)
  conjoin    = (&&)

instance (Predicate b) => Predicate (a -> b) where
  complement = (complement .)
  disjoin f g x = f x `disjoin` g x
  conjoin f g x = f x `conjoin` g x


-- examples:

ge :: Ord a => a -> a -> Bool
ge = complement (<)

pos = (>0)
nonzero = pos `disjoin` (pos . negate)
zero    = complement pos `conjoin` complement (pos . negate)

Я люблю Хаскелла!

-121--3572375-

который является хорошей альтернативой, особенно при работе с матрицами (проверьте ? какой и обратите внимание на аргумент arr.ind ). Но я предлагаю придерживаться sum из-за na.rm аргумента, который может обрабатывать NA в логическом векторе. Например:

# create dummy variable
set.seed(100)
x <- round(runif(100, 0, 1))
x <- x == 1
# create NA's
x[seq(1, length(x), 7)] <- NA

Если ввести sum (x) , вы получите NA в результате, но если вы передадите na.rm = TRUE в функции sum , вы получите нужный результат.

> sum(x)
[1] NA
> sum(x, na.rm=TRUE)
[1] 43

Является ли ваш вопрос строго теоретическим или у вас есть некоторые практические проблемы, касающиеся логических векторов?

6
ответ дан 23 November 2019 в 22:15
поделиться

В AspxTextBox можно задать свойство ClureInstureName.

<dxe:ASPxTextBox ID="InstrumentQuantity" 
 runat="server" Width="170px" 
 ClientInstanceName="MyTextBox"> 
</dxe:ASPxTextBox> 

CleySide:

function DoSomething()
{
    var theText = MyTextBox.GetValue(); //GetValue() is the DevExpress clientside function

    MyTextBox.SetValue('this is the value i want to use'); //Sets the text

}

Документация devexpress содержит довольно хорошую информацию о скриптах на стороне клиента. Перейдите по ссылке , щелкните Ссылку, затем выберите в меню DevExpress.Web.ASPxEditors.Script.

-121--4780109-

Я не писал это, но это было внесено @ amitrathore в Twitter :

(defn kv [bag [k v]] 
  (update-in bag [k] conj v))
(defn mergeMatches [propertyMapList]
  (reduce #(reduce kv %1 %2) {} propertyMapList))
-121--3502261-

Я делал нечто подобное несколько недель назад. Вот возможное решение, оно написано с нуля, так что это своего рода бета-релиз или что-то подобное. Я постараюсь улучшить его, удалив циклы из кода...

Основная идея состоит в том, чтобы написать функцию, которая будет принимать 2 (или 3) аргументы. Первый - это data.frame , в котором хранятся данные, собранные из вопросника, а второй - числовой вектор с правильными ответами (это применимо только для вопросника с одним выбором). Можно также добавить третий аргумент, возвращающий числовой вектор с окончательным результатом, или data.frame со встроенным результатом.

fscore <- function(x, sol, output = 'numeric') {
    if (ncol(x) != length(sol)) {
        stop('Number of items differs from length of correct answers!')
    } else {
        inc <- matrix(ncol=ncol(x), nrow=nrow(x))
        for (i in 1:ncol(x)) {
            inc[,i] <- x[,i] == sol[i]
        }
        if (output == 'numeric') {
            res <- rowSums(inc)
        } else if (output == 'data.frame') {
            res <- data.frame(x, result = rowSums(inc))
        } else {
            stop('Type not supported!')
        }
    }
    return(res)
}

Я постараюсь сделать это более элегантным способом с некоторой функцией * слоя. Обратите внимание, что я не ставил na.rm аргумент... Сделает это

# create dummy data frame - values from 1 to 5
set.seed(100)
d <- as.data.frame(matrix(round(runif(200,1,5)), 10))
# create solution vector
sol <- round(runif(20, 1, 5))

Теперь примените функцию:

> fscore(d, sol)
 [1] 6 4 2 4 4 3 3 6 2 6

Если передать аргумент data.frame, он вернет измененный data.frame. Я постараюсь исправить это... Надеюсь, это поможет!

0
ответ дан 23 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

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