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如果有人对此线程有更好的标题,请随时编辑

4

3 回答 3

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.

于 2012-10-24T18:21:23.410 回答
3

我今天可能有点密集,但 readlines('enter something')随后键入 "3.30" (不带引号)会产生返回的字符值 "3.30" 。

因此,要么用调用填充你的函数,readlines要么挖掘源代码readlines并修改它以满足你的需要。

虽然我不得不说让用户将所有内容都输入到一个文件中似乎要容易得多,如果需要,可以使用read.tableor读取文件scan并将输入类型指定为“字符”。

回答泰勒的评论:

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

大概您可以按照您想要的任何方式拆分这样的字符串:-) 以获得单独的数字字符串。(用户在提示“输入数据:”后键入内容

于 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 回答