不要在不带引号的字符串中删除零作为参数

时间:2012-10-24 16:46:14

标签: r

我正在尝试为允许用户读取数据而不带引号的包创建函数。它几乎按预期工作,除非函数将3.30变为3.3,即使最终输出是字符。如何让我的函数读取数字元素,但不删除尾随零。全局的想法是:

  1. 不使用引号读取元素的函数
  2. 函数不会丢弃R认为非重要的零
  3. 虽然元素可能看起来是数字,但我希望它们作为字符元素输出
  4. 以下是两次尝试及其输出内容(一次尝试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如果有人有更好的标题可以随意编辑

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"

据推测,您可以按照您想要的方式拆分字符串:-)以获取单个数字字符串。 (用户在提示'输入数据后'输入内容:'

答案 2 :(得分: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"