我正在尝试为允许用户读取数据而不带引号的包创建函数。它几乎按预期工作,除非函数将3.30变为3.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如果有人有更好的标题可以随意编辑
答案 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.table
或scan
读取文件,并将输入类型指定为“字符”。
回答泰勒的评论:
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"