如何将用户输入读入子命令

时间:2014-05-21 23:02:52

标签: r dataframe

我有一些像这样的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)要求用户输入var1var2

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]

在这种情况下如何阅读多个变量?

2 个答案:

答案 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")

它不是超级健壮的,但是如果你复制前半部分(在暂停之前),它会询问你两个变量号,然后如果你运行下半部分,它将使用这两个值。我已将aggregatesubset调整为更适合变量使用,这意味着不使用公式语法。

我没有做任何错误检查。这留给了提问者。