6

ユーザーが引用符なしでデータを読み取れるようにするパッケージの関数を作成しようとしています。最終的な出力が文字であっても、関数が 3.30 を 3.3 に変えることを除けば、ほぼ期待どおりに機能します。数値である要素を読み込むが、末尾のゼロを削除しない関数を取得するにはどうすればよいですか。全体像のアイデアは次のとおりです。

  1. 引用符を使用せずに要素を読み取る関数
  2. 関数は、R が重要でないゼロと見なすものを破棄しません。
  3. 要素は数値に見えるかもしれませんが、文字要素として出力したい

ここに2つの試みとそれらが出力したものがあります(1つの試みともう1つのsubstitute(...())試みmatch.call(expand.dots = FALSE)

#attempt #1 
fun <- 
function(...){ 
    substitute(...())
}

fun(3.30, 5.05)

#dropped zero on 3:30 (not what I want)
> fun(3.30, 5.05)
[1] "3.3"  "5.05"

#attempt #2 
fun <- 
function(...){ 
    x <- match.call(expand.dots = FALSE)
    as.character(x[[2]])
}

fun(3.30, 5.05)

#again dropped zero on 3:30 (not what I want)    
> fun(3.30, 5.05)
[1] "3.3"  "5.05"

引用符を使用すると、必要なものが出力されますが、これは引用符を提供する必要がないという目的を無効にします。

fun('3.30', '5.05')

> fun('3.30', '5.05')
[1] "3.30" "5.05"

PS誰かがこのスレッドのより良いタイトルを持っている場合は、自由に編集してください

4

3 に答える 3

5

考えられる方法が 1 つありますが、あまりきれいではなく、安定していない可能性があります。R は、入力された通話の履歴も保存します。これを使用して、正確な入力を取得できます。

fun <- 
  function(...){
    savehistory(file <- tempfile())
    hist <- readLines(file)
    args <- hist[length(hist)]
    args <- unlist(regmatches(args,gregexpr("(?<=fun\\().*(?=\\))",args,perl=TRUE)))
    args <- unlist(strsplit(args,split=","))
    as.character(args)
  }

例:

> fun(2.20,3.14,pi,0.000000)
[1] "2.20"     "3.14"     "pi"       "0.000000"

これがどれほど安定するかはわかりませんが、おそらく何十回も壊れるでしょう。また、これは関数の名前が であることを前提としていますfun

于 2012-10-24T18:21:23.410 に答える
3

今日は少しぎこちないかもしれませんが、 readlines('enter something')続けて "3.30" (引用符なし) と入力すると、文字値 "3.30" が返されます。

readlinesしたがって、関数を呼び出しで埋めるか、ソースを掘り下げreadlinesてニーズに合わせて変更してください。

read.tableユーザーがすべてをファイルに入力するだけで、必要に応じてファイルを読み取ったりscan、入力タイプを「文字」として指定したりする方がはるかに簡単だと言わざるを得ません。

タイラーのコメントに答えて:

 foo<-function(){
 + readline('enter data: ')->foostuff
 + return(foostuff)
 + }
 > foo()
 enter data: 4.30 56 hello world
 [1] "4.30 56 hello world"

おそらく、そのような文字列を好きなように分割して、個々の数値文字列を取得できます:-)。(ユーザーはプロンプト「enter data:」に続いて入力します。

于 2012-10-24T19:48:39.593 に答える
2

残念ながら、これは不可能です。ほとんどの言語と同様に、R は 3.3 と 3.30 を同じものとして扱います (つまり、有効桁数は格納されません)。

> 3.30
[1] 3.3

> 3.30 == 3.3
[1] TRUE

> deparse(3.30)
[1] "3.3"

すべての入力の桁数が同じ場合、 を使用formatして正しい結果を得ることができます

> format(3.3, nsmall=2)
[1] "3.30"
于 2012-10-24T17:42:33.150 に答える