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