带循环的R函数

时间:2020-09-05 20:55:46

标签: r


binary_subset<-function(a){
  a_seq = lapply(a, seq, 0)   # keep 0s as 0, make 1s c(1, 0)
  subset=do.call(expand.grid, a_seq)
  colnames(subset)=(1:length(a))
  print(subset)
}

a<-c(0,0,1,0)
b<-c(1,0,0,0)

inter_a<-binary_subset(a)
inter_b<-binary_subset(b)
interactions_ab<-rbind(inter_a,inter_b)
interactions_no_duplicate<-unique(interactions_ab[1:length(a)])


> interactions_no_duplicate
  1 2 3 4
1 0 0 1 0
2 0 0 0 0
3 1 0 0 0


inter_no_duplicate<-function(a,b){

inter_a<-binary_subset(a)
inter_b<-binary_subset(b)
interactions_ab<-rbind(inter_a,inter_b)
interactions_no_duplicate<-unique(interactions_ab[1:length(a)])

interactions_no_duplicate
}



> inter_no_duplicate(a,b)
  1 2 3 4
1 0 0 1 0
2 0 0 0 0
  1 2 3 4
1 1 0 0 0
2 0 0 0 0
  1 2 3 4
1 0 0 1 0
2 0 0 0 0
3 1 0 0 0

我正在尝试编写is函数来获取一些二进制交互。首先,我以简单明了的形式编写了代码,并获得了所需的输出。但是,当我将所有内容放到函数中时,输出是不一样的。它包括一些额外的行(尽管我想要的输出在那里!)。第二个输出的最后3行是我的答案,它与第一个输出完全匹配。为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:1)

您应该使用return(subset)或仅在函数subset底部使用binary_subset,例如

binary_subset <- function(a) {
  a_seq <- lapply(a, seq, 0) # keep 0s as 0, make 1s c(1, 0)
  subset <- do.call(expand.grid, a_seq)
  colnames(subset) <- (1:length(a))
  return(subset)
}

或更短的一个

binary_subset <- function(a) {
  a_seq <- lapply(a, seq, 0) # keep 0s as 0, make 1s c(1, 0)
  `colnames<-`(do.call(expand.grid, a_seq),1:length(a))
}

答案 1 :(得分:0)

R函数返回最后一行,就像您的import java.util.Scanner; public class AverageOfPositiveNumbers { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //Task is to keep count of positive integers, sum and calculate average double pNumbers = 0; int sum = 0; //Task is to read user input and assign a variable while (true) { //Task is to prompt user for input System.out.println("Enter number:"); int number = Integer.valueOf(scanner.nextLine()); //Task is to terminate the program when user inputs 0 if (number == 0) { break; } if (number > 0) { pNumbers = pNumbers + 1; sum = sum + number; } } //The task is to calculate the average //print only if user has given numbers and avoid dividing by zero if (sum + pNumbers > 0) { double average = (sum / pNumbers); System.out.println(average); } else { System.out.println("Cannot calculate the average"); } } } 函数或inter_no_duplicate()return())中的内容。

您要求return(interactions_no_duplicate)打印子集,因此它将在控制台中打印。 binary_subset()调用两次inter_no_duplicate(),因此在binary_subset()数据之前有两次打印。
如果尝试使用interactions_no_duplicate,将在控制台中看到两个打印件,而test <- inter_no_duplicate(c(0, 0, 1, 0), c(1, 0, 0, 0))将是您想要的数据。

如果要在控制台中打印,请删除test或保留它,但至少应在print()数据或变量的末尾添加return(subset)