[Rd] about textConnection
Simon Urbanek
simon.urbanek at r-project.org
Mon Mar 14 14:36:46 CET 2011
Kenn,
you might have had a point a while ago, but you may want to check most recent R and re-evaluate:
?textConnection
[...]
object: character. A description of the connection. For an input
this is an R character vector object, and for an output
connection the name for the R character vector to receive the
output, or 'NULL' (for none).
[...]
Details:
An input text connection is opened and the character vector is
copied at time the connection object is created, and 'close'
destroys the copy. 'object' should be the name of a character
vector: however, short expressions will be accepted provided they
deparse to less than 60 bytes.
Cheers,
Simon
On Mar 14, 2011, at 7:32 AM, Kenn Konstabel wrote:
> Hello,
>
> `textConnection` prepares arguments for an internal function, and one of
> these arguments is "description" that must be a character vector of length 1
> (or so it seems).
>
> Now the one and only argument you usually give to `textConnection` is
> called "object"; from the code you can see how this becomes a "description":
>
> .Internal(textConnection(deparse(substitute(object)), object,
> open, env, type))
>
> deparse(substitute(object)) -- which is intended to get the name of the
> object you supplied. Try
>
>> obj <- "a 1\nb 2\nc 3"
>> deparse(substitute(obj))
> [1] "obj"
>> deparse(substitute("a 1\nb 2\nc 3"))
> [1] "\"a 1\\nb 2\\nc 3\""
>
> This is called "non-standard evaluation" - in almost every other case it
> makes no difference whether you do some_fun(obj) or some_fun("a 1\nb 2\nc
> 3") but in this case it does.
>
> Now for some reason (I'm not exactly sure why this happens) the result
> deparse+substitute of your gsub thing is a character vector of length 2.
>
> ugly.string <- deparse
> (substitute(gsub("&","\n",(strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','\\"')[[1]][6]))))
>
> length( ugly.string)
>
> Anyway, if the textConnection object has a "description" component then it
> is probably useful for something but something like "gsub(\"&\", \"\\n\",
> (strsplit(\"{\\\"abc\\\",{\\\"def\\\",\\\"X,1&Y,2&Z,3\\\"}}\" doesn't seem
> too useful. If you really hate the intermediate step (assignment) then a
> solution might be to use the internal textConnection function directly, or
> modify the code of `textConnection` e.g. like this:
>
> tc <- function (object, open = "r", local = FALSE, encoding = c("",
> "bytes", "UTF-8")) {
> env <- if (local) parent.frame() else .GlobalEnv
> type <- match(match.arg(encoding), c("", "bytes", "UTF-8"))
> description <- deparse(substitute(object))
> is.ugly <- function(x) length(x)>1
> if(is.ugly(description)) description <- "a nice description"
> .Internal(textConnection(description, object, open, env, type))
> }
>
> # this will work with your examples
>
> Bu the answer to your bug report was not particularly helpful (a simple
> "RTFC" would have helped more) and from an ordinary mortal's perspective
> it is also wrong.
>
>> your usage is incorrect.
>> object: character. A description of the connection. For an input
>> this is an R character vector object ...
>> and you used an expression. Some expressions work, but only
>> simple ones (and none are guaranteed to).
>
> But what you actually used is "character" and not an expression:
>
> is.character(gsub("&","\n",(strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','\\"')[[1]][6])))
> # TRUE
> is.expression(gsub("&","\n",(strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','\\"')[[1]][6])))
> # FALSE :-P
>
> (Provided that standard evaluation is used which one would ordinarily
> expect.) So in my opinion, the documentation is not complete here: it should
> say explicitly that the object would better be a simple name and that
> otherwise the result is not guaranteed.
>
>
> Best regards,
> Kenn
>
>
> On Thu, Mar 10, 2011 at 12:20 PM, WANGSONG <mr.wangsong at hotmail.com> wrote:
>
>>
>> I need read a table in a string with special format. I used read.csv and
>> textConnection function.
>> But i am confuse about textConnection by follow code.
>>
>> case A: It is OK£¡
>> str0 <- '{"abc",{"def","X,1&Y,2&Z,3"}}'
>> str1 <- strsplit(str0,'"')[[1]][6]
>> str2 <- gsub("&","\n", str1)
>> con <- textConnection( str2 )
>> read.csv(con,header=F)
>> close(con)
>>
>> case B: It is NOK!
>> con <- textConnection(
>> gsub("&","\n",(strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','"')[[1]][6])) )
>> # Error in here
>> read.csv(con,header=F)
>> close(con)
>>
>> case C: It is OK!
>> str0 <- '{"abc",{"def","X,1&Y,2&Z,3"}}'
>> con <- textConnection( gsub("&","\n", (strsplit(str0,'"')[[1]][6])) )
>> read.csv(con,header=F)
>> close(con)
>>
>> case D: It is OK!
>> str2 <- gsub("&","\n",
>> strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','"')[[1]][6])
>> con <- textConnection( str2 )
>> read.csv(con,header=F)
>> close(con)
>>
>> Except case B, textConnection report "invalid 'description' argument", in
>> other case, textConnection is OK.
>>
>> I don't known, what is different£¿ I report it as [Bug 14527], But the
>> Answer is :
>>> your usage is incorrect.
>>> object: character. A description of the connection. For an input
>> this is an R character vector object ...
>>> and you used an expression. Some expressions work, but only simple ones
>> (and none are guaranteed to).
>>
>> I read the help carefully, but i don't known which usage is incorrect.
>>
>> Would you help me?
>>
>>
>> WangSong
>>
>>
>> [[alternative HTML version deleted]]
>>
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list