Как избежать зацикливания в 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 был задан. Вот это да. Приятно видеть другой способ сделать это. — Джей Ди Лонг
Почему программа зацикливается при переборе?
Пишу программу по решению Судоку, реализую методом перебора с возвратом, но при выполнении она начинает зацикливаться. Подскажите пожалуйста что я делаю не так, вот код:
Основной код перебора:
Код функции сокращения кандидатов:
- Вопрос задан более трёх лет назад
- 747 просмотров
Оценить 4 комментария
- Вконтакте
Очень сложно понять код. Он длинный, в нем переменные с загадочными названиями из мимимума букв и горсть магических чисел.
Вы пробовали проходить алгоритм дебаггером? Где код циклится?
Vernal96: > А дебаггером проверять невероятно долго, ну или я просто не умею им пользоваться
Вряд ли дольше, чем вникать в код)
В VS есть условные брейкпоинты, так что можно настроить их на определенную итерацию.
Не думаю, что кто-нибудь будет вдаваться в подробности такого не читаемого кода, поэтому предлагаю вам решить проблему самостоятельно, открыв для себя такое чудесное слово, как «Отладчик«.
Все очень просто: поставьте после каждого цикла while и for (на всякий случай) точки остановки. Запустите программу и каждую точку, на которой остановится отладчик, просто пропустите клавишей F5. В итоге, как только программа «зациклится», вы будете знать, до какой точки вы не дошли, следовательно, виновен будет цикл, стоящий до этой точки остановки.
Ну, а потом уже ставите точку остановки перед этим циклом и клавишей F10 по шагам разбираетесь,почему условие цикла не выполняется.
Как избежать зацикливания условия?
Мне нужно написать консольную игру Bingo для JavaScript. Это одно из упражнений, которое я должен выполнить перед Bootcamp, в котором я буду участвовать, поэтому имейте в виду, что я новичок. Если кто-то не знает игру:
- У вас будет «карточка» с 15 числами (не повторяющимися и случайными).
- Каждый ход будет отображаться случайное число (шар для бинго).
- Цифры от 1 до 90, поэтому эти числа будут иметь как шары, так и карточки бинго.
- Когда номер шара совпадает с номером на вашей карте, номер вашей карты будет изменен на «X».
Теперь, когда я объяснил это, моя проблема заключается в следующем: у меня есть функция для создания шара со случайным числом каждый ход. Чтобы узнать, выпало ли число уже или нет, я создал массив, чтобы протолкнуть числа, которые уже пропали. Таким образом, мы можем создать цикл с условием if, чтобы проверить, имеет ли мяч то же значение, что и массив [i] number. То, как я это сделал, начинается хорошо, но заканчивается беспорядком в консоли Chrome . как только он получает 90 чисел в массиве, он начинает перебирать массив и генерировать случайные числа, пока не найдет последние оставшиеся числа.
AngularJS: как предотвратить вечное зацикливание рекурсивных шаблонов
Я написал набор кода, который при привязке к объекту будет отображать ключ и значение каждого свойства в этом объекте.
И внутри контроллера:
Это прекрасно работает, когда ваши вложенные объекты создают простую древовидную структуру. Но он выдает исключение при создании цикла: если одно из ваших свойств ссылается на какой-либо объект выше по течению, оно будет отображаться до тех пор, пока не будет достигнут предел дайджеста (обычно 10).
Теперь вот мой вопрос. Есть ли какой-то способ в угловом контроллере/шаблоне для ng-if, если объект уже был показан, таким образом, перехватывая любые циклы и отображая только одну итерацию?
Бонусные баллы, если вы сможете придумать решение, которое будет применяться глобально на графике, или решение, которое будет отслеживать только текущую ветвь.
2 ответа
Начните с пустого VisitReferences.
Каждый раз, когда вы сталкиваетесь с какой-либо ссылкой (объектом), проверьте, есть ли она в посещенных ссылках, и если да, то не следуйте этой ссылке, в противном случае добавьте ее в посещенные ссылки.