2017-11-23 11 views
2

この関数は、最初のreadline()プロンプトでユーザーが入力した整数を使用し、その整数に基づいてreadline()入力の次のセクションを実行する必要があります。readline()ユーザー入力x回数を繰り返してインクリメントする

numSampFolders == 1の場合、以下のコードに従って、サンプルフォルダ名が1つだけ必要です。同様に、numSampFolders == 2の場合、2つのサンプルフォルダ名が必要です。

私はそれをどのように設定したかよりも良い書き方でなければなりません。(実際にはすべての出来事をカバーするために数多くのif()の文で終わりたいとは思っていません。たとえば、numSampFolders = 24の場合、コードはreadline()を介してユーザーに24の名前を入力し、それらの名前をグローバル変数として保存するように要求する必要があります。 (これはlist.files()でより簡単に行うことができますが、同じディレクトリには不要なフォルダがあります)。 アイデアをありがとう。

set_params <- function(){ 
    numSampFolders <- (readline("How many sample folders are you using? ")) 
    numSampFolders <<- as.numeric(numSampFolders) 
    if (numSampFolders == 1) 
     SampFolder1 <<- readline("Enter the name of your only sample folder: ") 
    if (numSampFolders == 2) 
     SampFolder1 <<- readline("Enter the name of sample folder 1: ") 
     SampFolder2 <<- readline("Enter the name of sample folder 2: ") 
} 
if(interactive()) set_params() 
+0

サンプルのフォルダ名をすべて使用して別のファイルを提供するようにユーザーに指示する方が簡単です。それはユーザーの仕事の同じ量です... – CPak

+0

それはおそらくより大きいフォルダ番号ですが、理想的ではない2つまたは3つのフォルダがある場合。 – heds1

答えて

1

一般的なアプローチは、反復およびR動詞assignためlapply(又はsapply/for)を使用することです。 assign<-のように振る舞い、assignはのように振る舞い、envir = .GlobalEnvで環境を指定します。次のソリューション

set_params <- function(){ 
    numSampFolders <- (readline("How many sample folders are you using? ")) 
    numSampFolders <<- as.numeric(numSampFolders) 
    if (numSampFolders == 1) { 
     SampFolder1 <<- readline("Enter the name of your only sample folder: ") 
    } else if (numSampFolders > 1) { 
     lapply(seq_len(numSampFolders), function(i) assign(paste0("SampFolder", i), readline(paste0("Enter the name of sample folder ", i, ": ")), envir = .GlobalEnv)) 
    } 
} 
if(interactive()) set_params() 

を参照すると、ここに私のコンソールの出力だ

ls() 
# character(0) 

# How many sample folders are you using? 2 
# Enter the name of sample folder 1: ok 
# Enter the name of sample folder 2: whatever 
# [[1]] 
# [1] "ok" 

# [[2]] 
# [1] "whatever" 

ls() 
# [1] "numSampFolders" "SampFolder1" "SampFolder2" "set_params" 

SampFolder1 
# [1] "ok" 

あなたかもしれないコンソールへのlapplyプリント値のように(この場合には、それは副作用です)。以下は、私がその場合

# [[1]] 
# [1] "ok" 

を参照てるものです、あなたは副作用なしでループにpurrr::walkを使用することができます。

library(purrr) 
set_params <- function(){ 
    numSampFolders <- (readline("How many sample folders are you using? ")) 
    numSampFolders <<- as.numeric(numSampFolders) 
    if (numSampFolders == 1) { 
     SampFolder1 <<- readline("Enter the name of your only sample folder: ") 
    } else if (numSampFolders > 1) { 
     walk(seq_len(numSampFolders), function(i) assign(paste0("SampFolder", i), readline(paste0("Enter the name of sample folder ", i, ": ")), envir = .GlobalEnv)) 
    } 
} 

if(interactive()) set_params() 
関連する問題