Функция действует на списки аргументов - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь сократить следующий код с помощью функции, но я получаю несколько неожиданный результат. Если я использую этот код

A <- data.frame(x = c(1,2,3), y = c(4,5,6))
B <- data.frame(x = c(7,8), y = c(1,2))
Lst <- list(A, B) 
names(Lst) <- c('A','B')
idx <- c('A', 'B')

Lst[['A']]['name'] <- 'A' 
Lst[['B']]['name'] <- 'B' 

, я получаю вывод

> Lst
$A
  x y name
1 1 4    A
2 2 5    A
3 3 6    A

$B
  x y name
1 7 1    B
2 8 2    B

, как и ожидалось. Вместо этого я хотел использовать функцию, чтобы сделать результат более общим, для других приложений, используя этот код:

bad.lst <- mapply(function(lst,x) {
  lst[[x]]['name'] <- x
  return(lst)
}, Lst, idx)

, и результат неожиданно

  A           B          
x Numeric,3   Numeric,2  
y Numeric,3   Numeric,2  
A Character,3 Character,2

Is Есть ли способ исправить второй код, чтобы получить тот же результат, что и в первом коде?

1 Ответ

3 голосов
/ 14 февраля 2020

Мы можем использовать Map

Lst1 <- Map(cbind, Lst, name = names(Lst))

, поскольку mapply может вернуть матрицу, потому что по умолчанию она использует SIMPLIFY = TRUE

mapply(cbind, Lst, name = names(Lst))
#     A         B        
#x    Numeric,3 Numeric,2
#y    Numeric,3 Numeric,2
#name factor,3  factor,2 

Вместо этого, если мы изменим SIMPLIFY = FALSE

mapply(cbind, Lst, name = names(Lst), SIMPLIFY = FALSE)
#$A
#  x y name
#1 1 4    A
#2 2 5    A
#3 3 6    A

#$B
#  x y name
#1 7 1    B
#2 8 2    B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...