很抱歉麻烦你们。我是编程新手,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来访问新列表。
很抱歉,我的问题很简单,我正在努力学习编程,但是我并不聪明。
答案 0 :(得分:1)
正如@thelatemail所提到的,您可以通过功能return
和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)
答案 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)