Использование функции для создания списка, затем разделить на два списка - PullRequest
0 голосов
/ 27 сентября 2019

Извините, что беспокою вас, ребята.Я новичок в программировании и R действительно сложно.Я пытаюсь читать онлайн-решения, и в 95% случаев ответы слишком сложны для меня, чтобы понять.

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

пользовательские вводы aa (N, split).N представляет количество случайных элементов в созданном списке, который называется bb.Затем разделенное число представляет, как пользователь хочет разделить этот список на два, причем первый новый список содержит первые разделенные элементы, а второй список - остальные.например.

aa(7, 3)
bb = 1,5,7,3,6,4,2
cc1 = 1, 5, 7
cc2 = 3, 6, 4, 2

aa <- function (N, split) {
  bb <- list (sample (1:N))
  cc1 <- bb[[1]][1:split] 
  cc2 <- bb[[1]][split+1:N]
}

Проблема в том, что после того, как я запустил функцию, используя aa (7, 3), ни bb, ни cc не создаются.Я предполагаю, что функция должна иметь возможность создавать списки bb, cc1 и cc2 внутри самой функции, чтобы, когда пользователь вводит aa (7, 3), он мог сразу же набирать bb, cc1 и cc2 для доступа к новым спискам.

Извините за мой простой вопрос, я стараюсь изо всех сил изучать программирование, но я не очень умен.

Ответы [ 3 ]

1 голос
/ 27 сентября 2019

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

aa <- function(N, split){
    bb <- sample(1:N)
    s <- c(rep(1, split), rep(2, N - split))        
    assign("bb", bb, envir=.GlobalEnv)
    assign("cc1", bb[1:split], envir=.GlobalEnv)    
    assign("cc2", bb[split+1:N], envir=.GlobalEnv)  
}

Сначала убедитесь, что ваша среда пуста.Затем запустите функцию и проверьте снова:

ls()
aa(7, 3)
ls()

Теперь вы можете получить доступ к результатам, используя bb, cc1 и cc2.

1 голос
/ 27 сентября 2019

Как упомянул @thelatemail, вы можете return a list из функции

aa <- function (N, split) {
   bb <- sample(N)
   return(list(cc1 = bb[1:split], cc2 = bb[(split+1):N]))
}

Затем вы можете вызвать функцию

output <- aa(7, 3)

output
#$cc1
#[1] 1 5 3

#$cc2
#[1] 6 2 7 4

и получить доступ к отдельному элементу как output$cc1 и output$cc2.

Однако, если вам все еще нужны cc1 и cc2 в качестве отдельных объектов, используйте list2env

list2env(output, .GlobalEnv)
0 голосов
/ 27 сентября 2019
foo = function(N, split) {
    numbers = sample(N)
    grp = ceiling(sequence(N)/(N/split))
    split(x = numbers, f = grp)
}
foo(7, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...