Переименовывать списки без перезаписи данных в R

#r

#r

Вопрос:

Я хотел бы переименовать имена моих вложенных списков на одно и то же имя без изменения базовых данных.

Вот мой пример списка:

 #Create dataframes ABC.123 and ABC.987, where 'left' and 'right' columns are numeric and the 'up' column contains characters
ABC.123 <- cbind.data.frame(left = c(2, 3, 5), right = c(5, 8, 4) , up = c("aa","aa", "aa"))
ABC.123$up <- as.character(ABC.123$up)
ABC.987 <-  cbind.data.frame(left = c(7, 2, 9), right = c(3, 6, 1) , up = c("bb","bb", "bb"))
ABC.987$up <- as.character(ABC.987$up)

#Create a list called mylist, containing two dataframes: ABC.123 and ABC.987
mylist <- list(ABC.123 = ABC.123, ABC.987 = ABC.987)
$ABC.123
#  left  right  up 
#1  2     5     aa  
#2  3     8     aa
#3  5     4     aa  

$ABC.987
#  left  right  up 
#1  7     3     bb  
#2  2     6     bb
#3  9     1     bb
  

Я бы хотел, чтобы мой вывод выглядел так:

 perfect.list
$ABC
#  left  right  up 
#1  2     5     aa  
#2  3     8     aa
#3  5     4     aa  

$ABC
#  left  right  up 
#1  7     3     bb  
#2  2     6     bb
#3  9     1     bb  
  

И при простом изменении имени базовые данные изменяются, и я пытаюсь избежать этого, что я вижу, когда нажимаю на mylist в окне среды RStudio:

 names(mylist) <- c("ABC", "ABC")
mylist
$ABC
#  left  right  up 
#1  2     5     aa  
#2  3     8     aa
#3  5     4     aa

$ABC
#  left  right  up 
#1  2     5     aa  
#2  3     8     aa
#3  5     4     aa
  

Я могу получить идеальный результат.mylist, если применю изменение имени и введу «mylist» непосредственно в окне консоли, но опять же, если я нажму на mylist в среде RStudio, он покажет перезаписанные данные. Итак, я запрашиваю ошибку, и я не знаю, какая из них правильная.

В конечном итоге я собираюсь сделать.call(rbind) вложенные списки с тем же именем, если это поможет ответить на вопрос, почему я это делаю. Если я запрашиваю ошибку, есть ли лучший способ объединить мои вложенные списки?

Комментарии:

1. Вы дважды проверяли в новом сеансе R? Просто запуск names(mylist) <- c("ABC", "ABC") отлично работает для меня и не изменяет данные.

2. @joran, да, я только что полностью перезапустил RStudio. Когда я повторно запустил код из моего примера, я нажимаю на mylist в глобальной среде, я вижу неправильно перезаписанный список в соответствии с моим примером выше. Но когда я набираю «mylist» в окне консоли, он возвращает правильное переименование. Итак, какой из них правильный, и почему они не показывают одинаковые результаты?

3. Хорошо, единственное место, где я вижу неправильное поведение, — это если я нажимаю на объект на панели среды, которая затем открывает новую вкладку на панели редактора сценариев, и если я нажимаю на отдельные элементы там , я вижу, что отображаются неправильные данные. Это, безусловно, просто ошибка пользовательского интерфейса в RStudio.

4. Консоль верна. Объект — это то, что вы хотите. Это проблема с пользовательским интерфейсом RStudio. У нас нет возможности «исправить» это; вы можете сообщить им об этом как об ошибке.

5. На самом деле это известная старая ошибка в RStudio: github.com/rstudio/rstudio/issues/2966 . Что вы должны делать? Вы можете удалить его, если считаете, что это никому не поможет, но я думаю, что его следует сохранить. Таким образом, вы могли бы написать ответ, указывающий на этот отчет об ошибке, или, если кто-то другой это сделает, вы можете принять их ответ.

Ответ №1:

Согласно комментариям @user2554330 и @joran, то, что я пытаюсь выполнить в своем вопросе, вызывает хорошо известную, хорошо документированную ошибку в RStudio: https://github.com/rstudio/rstudio/issues/2966 .

В этом случае доверяйте выводам консоли, которые точно отражают любые манипуляции с объектами данных. И просто знайте, что то, что вы видите на панели среды RStudio, не является точным представлением ваших объектов данных.

И в целом, старайтесь избегать запроса ошибки в первую очередь, НЕ переименовывая свои списки или вложенные списки в неуникальный / дублирующий идентификатор.