Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R Don';t将不带引号的字符串中的零作为参数删除_R - Fatal编程技术网

R Don';t将不带引号的字符串中的零作为参数删除

R Don';t将不带引号的字符串中的零作为参数删除,r,R,我正在尝试为一个包创建一个函数,允许用户不带引号地读入数据。除了函数将3.30转换为3.3之外,它几乎与预期一样工作,即使最终输出是字符。如何让函数读入数字元素,但不删除尾随的零。总体思路是: 不使用引号读取元素的函数 函数不会丢弃R认为不重要的零 虽然元素可能看起来是数字的,但我希望它们作为字符元素输出 下面是两次尝试及其结果(一次尝试使用替换(…()),另一次尝试使用匹配。调用(expand.dots=FALSE): PS如果有人对此线程有更好的标题,请随意编辑。不幸的是,这是不可能的。与大

我正在尝试为一个包创建一个函数,允许用户不带引号地读入数据。除了函数将3.30转换为3.3之外,它几乎与预期一样工作,即使最终输出是字符。如何让函数读入数字元素,但不删除尾随的零。总体思路是:

  • 不使用引号读取元素的函数
  • 函数不会丢弃R认为不重要的零
  • 虽然元素可能看起来是数字的,但我希望它们作为字符元素输出
  • 下面是两次尝试及其结果(一次尝试使用
    替换(…())
    ,另一次尝试使用
    匹配。调用(expand.dots=FALSE)


    PS如果有人对此线程有更好的标题,请随意编辑。不幸的是,这是不可能的。与大多数语言一样,R将3.3和3.30视为相同(换句话说,不存储有效位数)

    如果所有输入的位数相同,则可以使用
    格式
    获得正确的结果

    > format(3.3, nsmall=2)
    [1] "3.30"
    

    我可以想出一种方法,但它不是很漂亮,也可能不稳定。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
    我今天可能有点密集,但是
    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"
    
    fooostuff
    +退货(食品)
    + }
    >foo()
    输入数据:4.30 56 hello world
    [1] “4.30 56你好,世界”
    

    假设您可以按任何方式拆分这样的字符串:-),以获得单个数字字符串。(用户在提示“输入数据:”

    Bingo之后键入内容。这也是我所能想到的,如果对
    fun()
    的调用超过两行或更多行,或者如果其中一个字符参数包含逗号,或者
    fun()的调用将中断。)
    是由另一个函数调用的,或者…仍然是非常好的答案!谢谢Carl。但是这能放在一个函数中吗?我是一个识字的人,在我的领域里没有多少人是R知识渊博的(这就是这个包的目的)。这个东西必须非常容易使用。没有额外的调用像
    readlines
    这样的东西。
    > format(3.3, nsmall=2)
    [1] "3.30"
    
    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"
    
     foo<-function(){
     + readline('enter data: ')->foostuff
     + return(foostuff)
     + }
     > foo()
     enter data: 4.30 56 hello world
     [1] "4.30 56 hello world"