我有一些像这样的R命令
subset(
(aggregate(cbind(var1,var2)~Ei+Mi+hours,a, FUN=mean)),
(aggregate(cbind(var1,var2)~Ei+Mi+hours,a, FUN=mean))$Ei == c(1:EXP)
)
我想做
1)要求用户输入var1
和var2
2)将这些变量放入子集命令行,如上所示 继续其他事情。
注意:对于读取用户输入,我有变量之类的
c(ax,bx,cx,dx,ex,fx,gx,hx,ix,jx,kx,lx,mx,nx,ox) = c(1:15)
和每个人
变量映射到数字1到15.因此为用户和
要求用户选择1到15之间的任何数字然后
检查输入数字的相应变量和
在我看来,将其读入命令行是最好的方法。
那么我该如何实现呢?
关于答案: 只是想知道有一种可能的情况,如果用户想要一次性输入多个数字。 [例如:1,2,3] ...比如下面的答案中使用
所述的阅读线阅读本文v1 <- quote(var1 <- as.numeric(readline('Enter Variable 1: ')))
eavl(v1)
xx <- paste0(letters[1:15], 'x')
xx[v1]
在这种情况下如何阅读多个变量?
答案 0 :(得分:0)
以下是readline
交互式提示的粗略示例。评估v1
时,系统将提示用户输入值。然后将该值存储为var1
。
> v1 <- quote(var1 <- as.numeric(readline('Enter Variable 1: ')))
> eval(v1)
Enter Variable 1: 1000 ## user enters 1000, for example
> 100 + var1 + 50 ## example to show captured output as object
## [1] 1150
所以在你的情况下它可能会像
> v1 <- quote(var1 <- as.numeric(readline('Enter a number from 1 to 15: ')))
> eval(v1)
Enter a number from 1 to 15: 7
> var1
## [1] 7
> xx <- paste0(letters[1:15], 'x')
> xx
## [1] "ax" "bx" "cx" "dx" "ex" "fx" "gx" "hx" "ix" "jx" "kx" "lx" "mx" "nx" "ox"
> xx[var1]
## [1] "gx"
我从this older SO post借用了这个想法。您可以隐藏地返回输出,它仍然会接收用户值。
input.fun <- function(){
v1 <- readline("var1: ")
v2 <- readline("var2: ")
v3 <- readline("var3: ")
v4 <- readline("var4: ")
v5 <- readline("var5: ")
out <- sapply(c(v1, v2, v3, v4, v5), as.numeric, USE.NAMES = FALSE)
invisible(out)
}
> x <- input.fun()
var1: 7
var2: 4
var3: 8
var4: 5
var5: 2
> x
[1] 7 4 8 5 2
响应您的修改:我不确定这是否是在一行中读取多个数字的标准方法,但它可以正常工作。
> xx <- readline('Enter numbers separated by a space: ')
Enter numbers separated by a space: 4 12 67 9 2
> as.numeric(strsplit(xx, ' ')[[1]])
## [1] 4 12 67 9 2
答案 1 :(得分:0)
使用scan()
#sample data
df<-data.frame(
ax=runif(50),
bx=runif(50),
cx=runif(50),
dx=runif(50),
Ei=sample(letters[1:5], 50, replace=T)
)
#get vars
vars<-c(NA,NA)
while(any(is.na(vars))) {
cat(paste("enter var number", sum(!is.na(vars))+1),"\n")
cat(paste(seq_along(names(df)), ":", names(df)), sep="\n")
try(n<-scan(what=integer(), nmax=1), silent=T)
vars[min(which(is.na(vars)))]<-n
}
#--pause
#use vars
subset(aggregate(df[,vars], df[,c("Ei"), drop=F], FUN=mean), Ei=="a")
它不是超级健壮的,但是如果你复制前半部分(在暂停之前),它会询问你两个变量号,然后如果你运行下半部分,它将使用这两个值。我已将aggregate
和subset
调整为更适合变量使用,这意味着不使用公式语法。
我没有做任何错误检查。这留给了提问者。