Давайте перепишем ваш код следующим образом:
x = 1
y = [x]
z = y * 4
myList = [z] * 3
После этого запустите следующий код, чтобы сделать все более понятным. Что делает код, в основном печатает id
s полученных объектов, которые
Вернуть «идентификатор» объекта
blockquote >и поможет нам идентифицировать их и проанализировать, что происходит:
print("myList:") for i, subList in enumerate(myList): print("\t[{}]: {}".format(i, id(subList))) for j, elem in enumerate(subList): print("\t\t[{}]: {}".format(j, id(elem)))
И вы получите следующий результат:
x: 1 y: [1] z: [1, 1, 1, 1] myList: [0]: 4300763792 [0]: 4298171528 [1]: 4298171528 [2]: 4298171528 [3]: 4298171528 [1]: 4300763792 [0]: 4298171528 [1]: 4298171528 [2]: 4298171528 [3]: 4298171528 [2]: 4300763792 [0]: 4298171528 [1]: 4298171528 [2]: 4298171528 [3]: 4298171528
Итак, теперь давайте шаг за шагом. У вас есть
x
, который является1
, и единственным списком элементовy
, содержащимx
. Ваш первый шаг -y * 4
, который даст вам новый списокz
, который в основном[x, x, x, x]
, т. Е. Создает новый список, который будет содержать 4 элемента, которые являются ссылками на исходный объектx
. Чистый шаг очень похож. В основном вы делаетеz * 3
, который является[[x, x, x, x]] * 3
и возвращает[[x, x, x, x], [x, x, x, x], [x, x, x, x]]
по той же причине, что и для первого шага.
Как сказал Паскаль, следующие работы
require(MASS)
require(dplyr)
mtcars %>%
dplyr::select(mpg)
Если вы сначала загрузите библиотеку MASS
и второй dplyr
one
library (MASS)
library (dplyr)
, тогда первая версия функции select
в вашей сессии searchpaths ()
будет той, библиотеки dplyr
.
Следовательно,
select(mtcars, mpg)
будет работать как
dplyr::select(mtcars, mpg)
Это случается со мной чаще, чем я должен признать. dplyr сталкиваются с MASS::select
, plyr::summarise
и stats::filter
, среди прочего, особенно при загрузке пакетов, загружающих одну из этих библиотек через библиотеку (они не должны, но некоторые до сих пор) или когда вы загружаете dplyr в свой .Rprofile
(не надо!). И это может привести к довольно неясным проблемам, а не всегда к сообщению об ошибке, особенно к конфликтам с plyr
.
Я только недавно узнал о функции conflicts()
. Это полезно, но конфликты «over-reports», когда два пакета имеют одинаковые функции, например. tidyr :: %>%
и dplyr :: %>%
.
Итак, я написал функцию , чтобы сказать мне, схожу ли я с ума или есть конфликт, вызывающий текущая ошибка. Он не только проверяет наличие конфликтов, но проверяет, является ли определенный желаемый пакет «сверху» и действительно ли тела функции отличаются.
Он делает это для dplyr по умолчанию, но вы можете указать другой пакет используя параметр want_package
. Например, я часто сбиваюсь с помощью recode
и alpha
, которые повторно используются во многих пакетах.
Использование просто: amigoingmad()
.
По умолчанию это также автоматически «фиксирует» вещи, если dplyr не «сверху», используя следующие команды:
detach("package:dplyr", character.only = TRUE)
library("dplyr", character.only = TRUE)
Обратите внимание, что функция будет сообщать, если заданная пользователем функция блокирует dplyr, но не исправить это автоматически в целях безопасности (просто удалите функцию в этом случае).
На данный момент это решение не вызвало у меня никаких проблем. Конечно, я бы не стал использовать это в производственном коде, но когда вы отлаживаете файл .Rmd
и, возможно, случайно испортили заказ на загрузку, это быстрый способ узнать.
Если вы хотите это в пакете:
devtools::install_github("rubenarslan/formr")
if(x == x) { ... }
. Любые идеи, почему эта ошибка внезапно появляется, где раньше не было проблем? – deca 31 January 2018 в 17:06