12

文字列のベクトルが与えられたので、引用符なしで式を作成したいと思います。

# eg, I would like to go from 
c("string1", "string2")

# to...  (notice the lack of '"' marks)
quote(list(string1, string2))

引用符を削除するのに問題が発生しています

input <- c("string1", "string2")
output <- paste0("quote(list(", paste(input, collapse=","), "))")

# not quite what I am looking for.     
as.expression(output)
expression("quote(list(string1,string2))")



これは、必要に応じて、data.table列の選択で使用するためのものです。
私が探しているものは、次のようにdata.tableに収まるはずです。

library(data.table)
mydt <- data.table(id=1:3, string1=LETTERS[1:3], string2=letters[1:3])

result <- ????? # some.function.of(input)
> mydt[ , eval( result )]
   string1 string2
1:       A       a
2:       B       b
3:       C       c
4

3 に答える 3

12

これが私がすることです:

## Create an example of a data.table "dt" whose columns you want to index 
## using a character vector "xx"
library(data.table)
dt <- data.table(mtcars)
xx <- c("wt", "mpg")

## Construct a call object identical to that produced by quote(list("wt", "mpg"))
jj <- as.call(lapply(c("list", xx), as.symbol))

## Try it out
dt[1:5,eval(jj)]
#       wt  mpg
# 1: 2.620 21.0
# 2: 2.875 21.0
# 3: 2.320 22.8
# 4: 3.215 21.4
# 5: 3.440 18.7

このように「言語で計算する」場合、作成しようとしているオブジェクトの構造を確認すると役立つことがよくあります。以下に基づいて (および と について理解すればas.call()) as.symbol()、目的の言語オブジェクトの作成は簡単になります。

x <- quote(list(wt, mpg))

str(x)
#  language list(wt, mpg)

class(x)
# [1] "call"

str(as.list(x))
# List of 3
#  $ : symbol list
#  $ : symbol wt
#  $ : symbol mpg
于 2013-02-04T23:47:10.563 に答える
5

as.quotedplyr パッケージからよく使う

 outputString <- sprintf('list(%s)', paste(input, collapse = ', ')) 


 library(plyr)
  output <- as.quoted(outputString)[[1]]

  mydt[, eval(output)]
   string1 string2
1:       A       a
2:       B       b
3:       C       c

ただし、単に列を選択するだけの場合は、文字列を渡して使用できます..(Unix ターミナルのように、「1 レベル検索する」ことを意味します)。

mydt[ , ..input]
   string1 string2
1:       A       a
2:       B       b
3:       C       c
于 2013-02-04T23:47:30.737 に答える
0

これらの回答は役に立ちましたが、式内で変数と複数の行を使用するには不完全でした。文字列から引用符付きの式を作成するには、変数と複数の行を使用して、quote()、top()、および subsitutute() を使用します。

  # Prepare variables
  samp_skewness = round(skewness(dv),2)
  samp_kurtosis = round(kurtosis(dv),2)
  samp_var = round(var(dv))
  samp_summ <- summary(dv)
  num_samples = length(dv)

  # Prepare quotes containing math annotations
  q1 = quote(paste(mu,"="))
  q2 = quote(paste(sigma,"="))
  q3 = quote(paste(gamma[1],"="))
  q4 = quote(paste(gamma[2],"="))

# Use subsitition to construct the expression, passing in the variables and quoted expressions
  title = substitute(atop(paste("Top Title, # samples: ", ns), 
            paste(e1,v1,", ",e2,v2,", ",e3,v3,", ",e4,v4)),
            list(ns=num_samples,v1=round(samp_summ['Mean']),v2=samp_var,
            v3=samp_skewness,v4=samp_kurtosis,e1=q1,e2=q2,e3=q3,e4=q4))

ggplot で: ...

labs(title = title) +

...

于 2015-04-04T18:38:37.530 に答える