2012-10-24 41 views
6

我正在試圖爲一個允許用戶讀取不帶引號的數據的程序包製作一個函數。它幾乎和預期一樣,除了函數將3.30變成3.3,即使最終的輸出是字符。我如何讓我的函數讀入數字元素,但不能刪除尾部零。大圖片的想法是:不要在沒有引號的字符串中刪除零作爲參數

  1. 功能,而無需使用帶讀取元素標誌着
  2. 功能不會放棄什麼考慮R非顯著零
  3. 儘管元素可以看數字,我希望他們可以爲文字輸出元素

這裏有兩個企圖以及他們放出來(一個嘗試與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如果有人有這個線程更好的標題隨意編輯

回答

5

那麼有我能想到的一種方式,但它是不是很漂亮並可能不穩定。 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

+0

賓果。這也是我能想到的,如果調用fun()延伸到兩行或更多行,如果其中一個字符參數包含一個逗號,或者如果另一個函數調用'fun()'或...仍然,非常好的答案! –

+0

感謝您+1 –

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" 
3

今天我可能有點緊張,但是readlines('enter something')後面鍵入「3.30」(不包括引號)會產生返回的字符值「3.30」。

因此,要麼用readlines來電填寫您的功能,要麼可以挖掘來源readlines並修改它以符合您的需求。

雖然我不得不說,如果需要,它似乎輕鬆了許多讓用戶只需鍵入一切成一個文件,並且,讀取read.tablescan文件並指定輸入類型爲「字符」。

在回答泰勒的評論:

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

你大概可以分成這樣一個字符串中任何你想要的:-)讓個體數字符串。(用戶在提示輸入數據後鍵入內容:'

+0

感謝Carl。但是這可以適用於一個函數?我是一個讀寫能力的人,並且我所在領域的人不多,都是R知識淵博的人(這是這個軟件包的用途),這個東西必須非常容易使用,不需要額外的調用像'readlines'。 –

+0

@ TylerRinker對我有幫助嗎? –

+0

是的,確實如此。+1 –

相關問題