Предложите как избежать зацикливания в методе перебора

от admin

Как избежать зацикливания в R: выбор элементов из списка

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

У меня есть список имен. Формат — имя_фамилия. Я хочу вывести из этого списка отдельный список только с именами. Кажется, я не могу понять, как это сделать. Вот несколько примеров данных:

что выглядит так:

Я мог бы получить то, что хочу, используя такие циклы:

что дало бы мне это:

Итак, как я могу сделать это без циклов?

Вы имеете в виду мою полную неспособность действительно научиться применять функции в R? Да, та же проблема, но другой нюанс. Спасибо за напоминание. — JD Long

10 ответы

Вы можете использовать apply (или sapply )

ответ дан 02 окт ’12, 18:10

И еще один подход:

Проще говоря, последняя строка извлекает первый элемент каждого компонента списка, а затем упрощает его до вектора.

Как это работает? Что ж, вам нужно реализовать альтернативный способ написания x[1] is «[«(x, 1) , т.е. есть функция с именем [ что делает подмножество. В sapply call применяет вызовы этой функции один раз для каждого элемента исходного списка, передавая два аргумента: элемент списка и 1.

Преимущество этого подхода перед другими заключается в том, что вы можете извлекать несколько элементов из списка без необходимости повторно вычислять разбиения. Например, фамилия будет sapply(pieces, «[«, 2) . Когда вы привыкнете к этой идиоме, ее будет довольно легко читать.

ответ дан 31 авг.

Хэдли, я вижу, что это работает, но понятия не имею, почему это работает. Есть ли где-то подразумеваемое «]»? Не могли бы вы немного уточнить? Мой R-foo явно слабый. — Джей Ди Лонг

Я тоже был немного шокирован этим, Джей Ди . поэтому, немного поиграв, я вижу, что:> «[» (ieces, 1) дает [[1]] [1] «боб» «кузнец» .. Конечно, нотация интересная и очень полезная! — Уильям Доан

В качестве примечания: если вы собираетесь разбивать фиксированные строки вместо регулярных выражений, вы можете рассмотреть возможность передачи fixed=TRUE в strsplit . Я обнаружил, что это может сильно повлиять на скорость strsplit . — Джонатан Чанг

Все операторы в R являются функциями — инфиксные операторы могут быть записаны в префиксной нотации. ИСТИНА || ЛОЖЬ можно записать как || (ИСТИНА, ЛОЖЬ), a [b] можно записать как [ (a, b), и даже операторы присваивания a [b] <- TRUE есть [<- (a, b, значение = ИСТИНА). R — это магия. — Hatmatrix

Не уверен, что это правильно, но должны быть кавычки (я использовал обратную кавычку, но обычные кавычки также должны работать) вокруг префиксных функций. — Hatmatrix

tlist <- c(«bob_smith»,»mary_jane»,»jose_chung»,»michael_marx»,»charlie_ivan»)
fnames <- gsub(«(_.*)$», «», tlist)
# _.* matches the underscore followed by a string of characters
# the $ anchors the search at the end of the input string
# so, underscore followed by a string of characters followed by the end of the input string

для подхода RegEx?

ответ дан 31 авг.

+1 за самый быстрый. С rep (t, 1e4) мой подход занял 83.23 секунды (81.41 из которых было потрачено на преобразование во фрейм данных!), Дэвид занял 4.39 секунды, а ваш — 0.81. Я думаю, что у него тоже лучший результат. — Мэтт Паркер

Спасибо, Мэтт . Мне было интересно узнать об эффективности каждого из этих решений! — Уильям Доан

это действительно информативно. Я просто предположил, что бит strsplit был задан. Вот это да. Приятно видеть другой способ сделать это. — Джей Ди Лонг

Почему программа зацикливается при переборе?

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

Читать:
Как привязать ip к домену

Код функции сокращения кандидатов:

  • Вопрос задан более трёх лет назад
  • 747 просмотров

Оценить 4 комментария

  • Facebook
  • Вконтакте
  • Twitter

Очень сложно понять код. Он длинный, в нем переменные с загадочными названиями из мимимума букв и горсть магических чисел.

Вы пробовали проходить алгоритм дебаггером? Где код циклится?

Vernal96: > А дебаггером проверять невероятно долго, ну или я просто не умею им пользоваться

Вряд ли дольше, чем вникать в код)
В VS есть условные брейкпоинты, так что можно настроить их на определенную итерацию.

Не думаю, что кто-нибудь будет вдаваться в подробности такого не читаемого кода, поэтому предлагаю вам решить проблему самостоятельно, открыв для себя такое чудесное слово, как «Отладчик«.

Все очень просто: поставьте после каждого цикла while и for (на всякий случай) точки остановки. Запустите программу и каждую точку, на которой остановится отладчик, просто пропустите клавишей F5. В итоге, как только программа «зациклится», вы будете знать, до какой точки вы не дошли, следовательно, виновен будет цикл, стоящий до этой точки остановки.

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

Как избежать зацикливания условия?

Мне нужно написать консольную игру Bingo для JavaScript. Это одно из упражнений, которое я должен выполнить перед Bootcamp, в котором я буду участвовать, поэтому имейте в виду, что я новичок. Если кто-то не знает игру:

  • У вас будет «карточка» с 15 числами (не повторяющимися и случайными).
  • Каждый ход будет отображаться случайное число (шар для бинго).
  • Цифры от 1 до 90, поэтому эти числа будут иметь как шары, так и карточки бинго.
  • Когда номер шара совпадает с номером на вашей карте, номер вашей карты будет изменен на «X».

Теперь, когда я объяснил это, моя проблема заключается в следующем: у меня есть функция для создания шара со случайным числом каждый ход. Чтобы узнать, выпало ли число уже или нет, я создал массив, чтобы протолкнуть числа, которые уже пропали. Таким образом, мы можем создать цикл с условием if, чтобы проверить, имеет ли мяч то же значение, что и массив [i] number. То, как я это сделал, начинается хорошо, но заканчивается беспорядком в консоли Chrome . как только он получает 90 чисел в массиве, он начинает перебирать массив и генерировать случайные числа, пока не найдет последние оставшиеся числа.

AngularJS: как предотвратить вечное зацикливание рекурсивных шаблонов

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

И внутри контроллера:

Это прекрасно работает, когда ваши вложенные объекты создают простую древовидную структуру. Но он выдает исключение при создании цикла: если одно из ваших свойств ссылается на какой-либо объект выше по течению, оно будет отображаться до тех пор, пока не будет достигнут предел дайджеста (обычно 10).

Теперь вот мой вопрос. Есть ли какой-то способ в угловом контроллере/шаблоне для ng-if, если объект уже был показан, таким образом, перехватывая любые циклы и отображая только одну итерацию?

Бонусные баллы, если вы сможете придумать решение, которое будет применяться глобально на графике, или решение, которое будет отслеживать только текущую ветвь.

2 ответа

Начните с пустого VisitReferences.

Каждый раз, когда вы сталкиваетесь с какой-либо ссылкой (объектом), проверьте, есть ли она в посещенных ссылках, и если да, то не следуйте этой ссылке, в противном случае добавьте ее в посещенные ссылки.

Похожие статьи