使用函数创建列表然后分成两个列表

时间:2019-09-27 03:16:43

标签: r

很抱歉麻烦你们。我是编程新手,R真的很难。我尝试阅读在线解决方案,而且95%的时间里,答案太复杂了,我无法理解。

我正在尝试使用一个函数来创建一个随机数列表,然后将它们分成两个。

用户输入aa(N,拆分)。 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 个答案:

答案 0 :(得分:1)

正如@thelatemail所提到的,您可以通过功能returnlist

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$cc1output$cc2的身份访问单个元素。

但是,如果您仍然需要cc1cc2作为单独的对象,请使用list2env

list2env(output, .GlobalEnv)

答案 1 :(得分:1)

这里是获取所需内容的一种方法,但这很危险,因为您可能会意外覆盖环境中已经存在的变量:

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访问结果。

答案 2 :(得分:0)

foo = function(N, split) {
    numbers = sample(N)
    grp = ceiling(sequence(N)/(N/split))
    split(x = numbers, f = grp)
}
foo(7, 2)